所以,我通常對Python中的Global Interpreter Lock(GIL)的工作原理有很好的理解。實質上,在解釋器正在運行時,一個線程持有N個滴答的GIL(其中N
可以使用sys.setcheckinterval
設置),此時GIL被釋放,另一個線程可以獲取GIL。如果一個線程開始I/O操作,也會發生這種情況。Python:GIL上下文切換
我有點困惑的是,這一切如何與C擴展模塊一起工作。
如果您有一個C擴展模塊獲取GIL,然後使用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);
見我的[相關問題](http://stackoverflow.com/questions/29317120/forcing-a-thread-to-block-all-other-threads-from-executing)。我不明白如何解決你的陳述和Python Cookbook中的陳述之間看似不一致的地方。 – max 2015-03-29 00:04:20
請參閱[Albert的答案](http://stackoverflow.com/a/29328066)。 – 2015-03-29 18:37:46