如果当操作系统分派另一个调用 Python 回调的线程时,唯一的 Python 解释器正在执行字节码 - 会发生什么?我对这种设计的可靠性的担忧是否正确?
一般情况下,C库需要调用PyEval_InitThreads()
在生成任何调用 python 回调的线程之前获得 GIL。并且回调需要被包围PyGILState_Ensure()
and PyGILState_Release()
以确保安全执行。
然而,如果 C 库运行在 python C 扩展的上下文中,那么在一些简单的情况下,完全省略 GIL 操作是安全的。
想想这个调用顺序:1) python 代码调用 C 函数foo()
, 2) foo()
spawns 唯一的一个运行另一个 C 函数的线程bar()
,它回调 python 代码,以及 3)foo()
总是加入或取消正在运行的线程bar()
返回之前。
在这种情况下,忽略 GIL 操作是安全的。因为foo()
ownsGIL(即从调用它的 python 代码中隐式借用)在其生命周期内,以及在生命周期内执行 python 回调foo()
被序列化(即只有一个回调线程并且 python 代码不包含threading
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)