我正在寻找一种使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()
看起来是很麻烦的,无论如何,它将允许从被中断的同一点恢复执行,因此将允许一个控制流。也许将其与子口译员结合起来?
我也发现了这一点
通过Py_AddPendingCall()
+ PyErr_SetInterrupt()
,
但它仅用于停止解释器,而不用于继续。因此可能无法考虑该解决方案。
我还考虑让python代码执行以通过I / O操作进行阻止(例如yieldControl()
从文件描述符读取一个字节,C代码在希望恢复执行时将写入该字节。但是再次执行只能从被中断的地方继续,也许将其与子解释器结合在一起?
或者我可能使事情变得过于复杂,应该启用loop1
和loop2
python线程?