因此,我对Python中的全局解释器锁(GIL)的工作原理有一个相当好的理解。基本上,在解释器运行时,一个线程将保持GIL N个滴答声(其中N可以使用sys.setcheckinterval设置),然后释放GIL并允许另一个线程获取GIL。如果一个线程开始I/O操作,也会发生这种情况。
但是,我有点困惑的是,这一切与C扩展模块如何协同工作。
如果您有一个C扩展模块获取了GIL,并使用PyEval_EvalCode执行一些Python代码,那么解释器是否可以释放GIL并将其传递给其他线程?还是获取GIL的C线程将永久持有GIL,直到PyEval_EvalCode返回并在C中显式释放GIL?
但是,我有点困惑的是,这一切与C扩展模块如何协同工作。
如果您有一个C扩展模块获取了GIL,并使用PyEval_EvalCode执行一些Python代码,那么解释器是否可以释放GIL并将其传递给其他线程?还是获取GIL的C线程将永久持有GIL,直到PyEval_EvalCode返回并在C中显式释放GIL?
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);