如果当操作系统调度另一个调用 Python 回调的线程时,唯一的 Python 解释器正在执行字节码 - 会发生什么?我担心这个设计的可靠性是对的吗?
问问题
1811 次
1 回答
3
在一般情况下,C 库需要PyEval_InitThreads()
在生成任何调用 python 回调的线程之前调用以获得 GIL。并且回调需要被包围PyGILState_Ensure()
并PyGILState_Release()
确保安全执行。
但是,如果 C 库在例如 python C 扩展的上下文中运行,那么在一些简单的情况下完全可以安全地省略 GIL 操作。
想想这个调用顺序:1)python 代码调用 C 函数foo()
,2)foo()
产生一个且只有一个线程运行另一个 C 函数bar()
,它回调 python 代码,3)总是在返回之前foo()
加入或取消运行的线程。bar()
在这种情况下,省略 GIL 操作是安全的。因为在其生命周期内foo()
拥有GIL(即从调用它的python代码中隐式借用),并且在其生命周期内python回调的执行foo()
是序列化的(即只有一个回调线程且python代码不合并threading
)。
于 2012-08-25T00:39:10.267 回答