簡體   English   中英

檢索無堆棧Python Tasklet綁定函數的返回值?

[英]Retrieving the Return Value of a Stackless Python Tasklet Bound Function?

無棧專家

我已經設法在Stackless Python下(從Stackless和C端)創建了tasklet。

在我看來,為了在Stackless中創建一個Tasklet,您需要將一個任意的Python可調用函數(函數)綁定到Tasklet(以及所需的參數),因此綁定的Callable將作為Tasklet運行。 但是,任意可調用對象實際上可能具有對調用者很重要的返回值。 但是我還沒有找到一種方法來檢索作為tasklet運行的綁定可調用對象的返回值。

在純Stackless Python方面,我確實看到了一個稱為Micromanaging的用法用法,該用法將原始函數與管理函數包裝在一起,這反過來又可以捕獲原始函數的返回值並將其保存在其他地方。

不幸的是,我的特殊用例涉及從C(C ++)端創建一個tasklet,並將其綁定到(可能阻塞的)Python可調用對象,該可調用對象具有重要的返回值供以后使用。 似乎在C端編寫這樣的Micromanaging函數不太可行,因為我還沒有找到一種方法可以將C函數動態地轉換為可調用的PyObject(不涉及模塊表初始化等),並且使用靜態無狀態C函數(我想原型必須是PyObject *(PyObject *,PyObject *))無論如何在C ++世界中通常不是一個好主意。

Stackless C API似乎也沒有包含適當的函數來檢索Tasklet的返回值。 是我必須在Python中編寫上述微管理功能( 可能是有狀態的)並提供一種方法來檢索保存在某處的返回值的唯一方法(以有狀態方式,即不使用全局變量)嗎? 還是我可能會探索其他選擇?

非常感謝你,

PS我了解在C和操作系統級別的編程中,線程函數的返回值僅對退出代碼有意義,並且線程函數將具有嚴格的函數原型,即C函數必須遵守一些嚴格的規則才能運行作為/通過線程。 現在我們在談論Python :)

從Stackless.com:

“ ...但是我還沒有找到一種方法來檢索作為tasklet運行的綁定可調用對象的返回值。...”

我不知道有一個。

“ ...重要的返回值供以后使用。在C端編寫這樣的Micromanaging函數似乎不太可行,因為我還沒有...”

最簡單的方法是將C中的包裝Python函數代碼定義為字符串,並將其編譯為可以作為tasklet運行的函數對象。 接下來是一個示例Python函數,我將剩下的C部分留給您。

例如

  def RunFunctionAndGetResult(chan, func, *args, **kwargs):
      chan.send(func(*args, **kwargs))

干杯,

理查德

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM