gpt4 book ai didi

python - 检索无堆栈 Python Tasklet 绑定(bind)函数的返回值?

转载 作者:太空宇宙 更新时间:2023-11-03 19:37:00 24 4
gpt4 key购买 nike

无堆栈专家,

我已经成功地在 Stackless Python 下创建了 tasklet(来自 Stackless 和 C 端)。

在我看来,为了在Stackless中创建一个tasklet,您可以将任意Python可调用(函数)绑定(bind)到该tasklet(以及所需的参数),因此绑定(bind)的可调用将作为一个tasklet运行。然而,任意可调用实际上可能具有对调用者来说很重要的返回值。但我还没有找到一种方法来检索作为 tasklet 运行的绑定(bind)可调用对象的返回值。

在纯 Stackless Python 方面,我确实看到了一种称为 Micromanaging 的用法,它用管理函数包装原始函数,而管理函数又可以捕获原始函数的返回值并保存它在某个地方用于其他上下文。

不幸的是,我的特殊用例涉及从 C (C++) 端创建一个 tasklet,绑定(bind)到一个(可能阻塞的)Python 可调用函数,该可调用函数具有稍后使用的重要返回值。看来在C端写这样一个Micromanaging函数不太可行,因为我还没有找到一种方法将C函数变成可动态调用的PyObject(不涉及模块表初始化等),并且使用静态无状态无论如何,C 函数(我假设原型(prototype)必须是 PyObject* (PyObject*, PyObject*))在 C++ 世界中通常是一个坏主意。

Stackless C API 似乎也不包含用于检索微线程的返回值的适当函数。这是我必须在Python中编写上面提到的微观管理函数(可能是有状态的)的唯一选择,并提供一种方法来检索保存在某处的返回值(以有状态的方式,即不使用全局)变量)?或者我可以探索其他选择?

非常感谢,

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

最佳答案

来自 Stackless.com:

“...但是我还没有找到一种方法来检索作为微线程运行的绑定(bind)可调用对象的返回值。...”

我不知道有这样一个。

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

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

例如

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

干杯,

理查德。

关于python - 检索无堆栈 Python Tasklet 绑定(bind)函数的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3092614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com