检索无Stacky Python Tasklet绑定函数的返回值?

时间:2010-06-22 11:28:01

标签: python stackless python-stackless

Stackless Experts,

我已经设法在Stackless Python下创建了tasklet(来自Stackless和C端)。

在我看来,为了在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中编写上述Micromanaging函数(可以是有状态的)的唯一选项,并提供一种方法来检索保存在某处的返回值(以有状态的方式,即不使用全局变量)?或者我可以探索其他选择吗?

非常感谢,

P.S。我理解在C和操作系统级编程中,线程函数的返回值仅对退出代码有意义,并且线程函数将具有严格的函数原型,即C函数必须遵守一些严格的规则才能变为可运行的/一个帖子。现在我们谈论Python:)

1 个答案:

答案 0 :(得分:1)

来自Stackless.com:

“...但我还没有看到一种方法来检索作为tasklet运行的绑定可调用的返回值。”

我不知道有一个。

“...稍后要使用的重要返回值。似乎在C端编写这样的微管理功能并不是很可行,因为我没有......”

最简单的方法是将C中的包装Python函数代码定义为字符串,并将其编译为可作为tasklet运行的函数对象。下面是一个示例Python函数,我留给你的C部分。

e.g。

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

干杯,

理查德。