Итак, у меня есть довольно хорошее представление о том, как работает Global Interpreter Lock (GIL) в Python. По сути, в то время как интерпретатор работает, один поток содержит GIL для N тиков (где N
можно установить с помощью sys.setcheckinterval
), после чего GIL освобождается, а другой поток может получить GIL. Это также происходит, если один поток начинает операцию ввода-вывода.Python: контекст GIL - переключение
Я немного смущен, так как все это работает с модулями расширения C.
Если у вас есть модуль расширения C, который приобретает GIL, а затем выполняет некоторый код python с использованием PyEval_EvalCode
, может ли интерпретатор освободить GIL и передать его в другой поток? Или поток C, который приобрел GIL, постоянно удерживает 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). Я не понимаю, как разрешить кажущуюся несогласованность между вашим заявлением и заявлением в Cookbook Python. – max
См. [Ответ Альберта] (http://stackoverflow.com/a/29328066). –