Also, ich habe im Allgemeinen ein ziemlich gutes Verständnis davon, wie die Global Interpreter Lock (GIL) in Python funktioniert. Im Wesentlichen, während der Interpreter läuft, hält ein Thread die GIL für N Ticks (wobei N
kann eingestellt werden mit sys.setcheckinterval
), zu welchem Zeitpunkt die GIL freigegeben ist und ein anderer Thread die GIL erwerben kann. Das passiert auch, wenn ein Thread eine E/A-Operation startet.Python: GIL Kontext - Switching
Worüber ich etwas verwirrt bin, ist, wie das alles mit C-Erweiterungsmodulen funktioniert.
Wenn Sie ein C-Erweiterungsmodul haben, das die GIL erwirbt und dann einen Python-Code mit PyEval_EvalCode
ausführt, kann der Interpreter die GIL freigeben und sie einem anderen Thread geben? Oder wird der C-Thread, der die GIL erworben hat, die GIL dauerhaft behalten, bis PyEval_EvalCode
zurückkehrt und die GIL explizit in C freigegeben wird?
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);
Siehe meine [verwandte Frage] (http://stackoverflow.com/questions/29317120/forcing-a-thread-to-block-all-other-threads-from-executing). Ich verstehe nicht, wie Sie die scheinbare Inkonsistenz zwischen Ihrer Aussage und der Aussage in Python Cookbook lösen können. – max
Siehe [Alberts Antwort] (http://stackoverflow.com/a/29328066). –