因此,我通常对 Python 中的全局解释器锁(GIL) 的工作原理有很好的了解。本质上,当解释器运行时,一个线程将 GIL 保存 N 个刻度(N
可以使用 设置sys.setcheckinterval
),此时 GIL 被释放,另一个线程可以获取 GIL。如果一个线程开始 I/O 操作,也会发生这种情况。
我有点困惑的是这一切如何与 C 扩展模块一起工作。
如果您有一个获取 GIL 的 C 扩展模块,然后使用 执行一些 python 代码PyEval_EvalCode
,解释器可以释放 GIL 并将其交给其他线程吗?或者获得 GIL 的 C 线程会永久持有 GIL,直到PyEval_EvalCode
返回并且 GIL 在 C 中显式释放?
PyGILState gstate = PyGILState_Ensure();
....
/* Can calling PyEval_EvalCode release the GIL and let another thread acquire it?? */
PyObject* obj = PyEval_EvalCode(code, global_dict, local_dict);
PyGILState_Release(gstate);