使用Python C API的“多线程”协程

时间:2019-12-02 10:38:46

标签: python-c-api

我正在寻找一种使Python脚本的控制流返回到C API的方法,以便可以模拟协程。

示例:

def loop1():
    while True:
        # do some work
        yieldControl()

def loop2():
    for i in lotsOfData():
        # do some work
        yieldControl()

C代码将执行此脚本(调用返回,因为该代码除了定义函数外没有执行其他操作),然后它将运行,例如loop1(),它通常会永远阻塞。

在这里,对yieldControl()的调用必须返回C代码,这样它才有可能保存解释器状态,并类似地运行loop2(),或恢复执行其中之一。根据一些标准,这两个控制流。


我环顾四周,找到了以下信息:

Python C API - Stopping Execution (and continuing it later)

但是使用setjmp()看起来是很麻烦的,无论如何,它将允许从被中断的同一点恢复执行,因此将允许一个控制流。也许将其与子口译员结合起来?


我也发现了这一点

Stopping embedded Python

通过Py_AddPendingCall() + PyErr_SetInterrupt(), 但它仅用于停止解释器,而不用于继续。因此可能无法考虑该解决方案。


我还考虑让python代码执行以通过I / O操作进行阻止(例如yieldControl()从文件描述符读取一个字节,C代码在希望恢复执行时将写入该字节。但是再次执行只能从被中断的地方继续,也许将其与子解释器结合在一起?


或者我可能使事情变得过于复杂,应该启用loop1loop2 python线程?

0 个答案:

没有答案