6

如果当操作系统调度另一个调用 Python 回调的线程时,唯一的 Python 解释器正在执行字节码 - 会发生什么?我担心这个设计的可靠性是对的吗?

4

1 回答 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 回答