【发布时间】:2019-09-14 04:03:57
【问题描述】:
这适用于网络守护程序,其中每个传入请求都通过解释器运行,具有轻量级的特定于请求的堆栈。解释器允许请求在等待阻塞 I/O 操作时让出控制权。通过这种方式,请求的操作与其他语言中的协程非常相似。单个 POSIX 线程可能有数千个处于已屈服或可运行状态的请求,但只有一个请求在积极取得进展。
使用 Lua 等其他嵌入式语言,可以将控制权交还给 C 调用者。这也是 NGINX 使用 Lua 作为其嵌入式脚本语言的原因之一。
我想知道是否有一种方法可以在 Python 线程等待异步满足条件时实现与 Python 类似的功能。
我认为 Python 将异步条件的细节暴露给 C 调用者,并让 C 调用者在条件满足时通知 Python 解释器是不现实的。但即使 Python 在没有关于异步条件的信息的情况下返回控制,它也可能允许 C 调用者将多个 Python 线程状态用作绿色线程。
这个想法是为每个请求附加一个线程状态,并让 python 解释器在特定线程和请求可运行时通知 C 调用者。最明显(但可能是最糟糕/最幼稚)的方法是 C 调用者轮询 Python 解释器,允许 Python 检查是否满足任何异步条件,并返回可运行线程状态的列表。然后 C 调用者将切换到可运行线程状态,并调用 Python 解释器继续执行。
如果您对此提出任何想法,我将不胜感激。即使知道 Python 协程是否有可能让位于 C 调用者,并让 C 调用者恢复协程也是有用的。
编辑
不建议在单独的进程中运行 Python 并通过管道或网络套接字向它发送请求。那是作弊。
编辑 2
看起来其他人实现了与我在 Emscripten 和 Python 之间建议的类似机制。
【问题讨论】:
-
这将是一个漫长而有趣的讨论。我只知道“投票”表明你做得不对
-
另外:事情不是靠魔法发生的。 C 必须遵循 python 协议并正确调用接收/迭代
-
好吧,如果 python 确实公开了它正在等待的文件描述符的详细信息,或者将下一个计时器事件触发给 C 调用者,那就太好了。我只是不确定,那个功能在那里。
-
是的,C 必须遵循所需的任何调用约定,但为了做到这一点,python 解释器需要将控制权返回给 C 调用者,或者调用 C 函数以收集额外的执行的线程状态。但这并没有那么有用,因为我们基本上需要在一根棍子上执行 Python,python 解释器在其自己的线程中执行,并通过消息传递接口与 C 调用者的解释器线程之一进行通信。
-
TBH 似乎更不可能有一种方法来排队/创建额外的线程状态以在 C 回调中执行。
标签: python c python-3.x python-asyncio