【问题标题】:Retrieving the Return Value of a Stackless Python Tasklet Bound Function?检索 Stackless Python Tasklet 绑定函数的返回值?
【发布时间】:2010-06-22 11:28:01
【问题描述】:

无堆栈专家,

我已经设法在 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 中编写上面提到的微管理函数(可能是有状态的)的唯一选择,并提供一种方法来检索保存在某处的返回值(以有状态的方式,即不使用全局变量)?还是我可以探索其他选择?

非常感谢,

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

【问题讨论】:

    标签: python stackless python-stackless


    【解决方案1】:

    来自 Stackless.com:

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

    不知道有没有。

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

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

    例如

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

    干杯,

    理查德。

    【讨论】:

    • 如果您有闲暇在您的某个 Python 模块中定义上述 Python 函数,那么您不必以 C 字符串的格式编译上述函数;在 C 端,您可以获取对该函数的引用并将其包装到 tasklet!
    猜你喜欢
    • 1970-01-01
    • 2011-12-19
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-03-29
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多