【发布时间】:2013-04-21 21:01:42
【问题描述】:
所以,我通常对 Python 中的 Global Interpreter Lock (GIL) 的工作原理有很好的了解。本质上,当解释器运行时,一个线程将 GIL 保存 N 个刻度(其中 N 可以使用 sys.setcheckinterval 设置),此时 GIL 被释放,另一个线程可以获取 GIL。如果一个线程开始 I/O 操作,也会发生这种情况。
我有点困惑的是这一切如何与 C 扩展模块一起工作。
如果你有一个获取 GIL 的 C 扩展模块,然后使用 PyEval_EvalCode 执行一些 python 代码,解释器可以释放 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);
【问题讨论】:
标签: python c python-3.x python-c-api cpython