1

无堆栈专家,

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

在我看来,为了在 Stackless 中创建 tasklet,您将任意 Python 可调用(函数)绑定到 tasklet(以及所需的参数),因此绑定的可调用将作为 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 :)

4

1 回答 1

1

来自 Stackless.com:

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

我不知道有一个。

“……后面要用到的重要返回值。看来在C端写这样一个微管理函数不太可行,因为我还没有……”

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

例如

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

干杯,

理查德。

于 2010-06-23T08:07:37.557 回答