Я немного не понимаю, когда мне звонить PyEval_InitThreads
. В общем, я понимаю, что PyEval_InitThreads
должен вызываться всякий раз, когда используется поток, отличный от Python (т. е. поток, порожденный в модуле расширения).
Однако я запутался, если PyEval_InitThreads
предназначен для программ C, которые встраивают интерпретатор Python, или программ Python, которые импортируют модули расширения C, или и того, и другого.
Итак, если я напишу модуль расширения C, который будет запускать внутренний поток, нужно ли мне вызывать PyEval_InitThreads
при инициализации модуля?
Кроме того, PyEval_InitThreads
неявно получает глобальную блокировку интерпретатора. Таким образом, после вызова PyEval_InitThreads
, предположительно, GIL должен быть освобожден, иначе возникнет взаимоблокировка. Итак, как снять блокировку? После прочтения документации PyEval_ReleaseLock()
кажется, что чтобы выпустить GIL. Однако на практике, если я использую следующий код в модуле расширения C:
PyEval_InitThreads();
PyEval_ReleaseLock();
... затем во время выполнения Python прерывается:
Fatal Python error: drop_gil: GIL is not locked
Итак, как вы выпускаете GIL после его приобретения с помощью PyEval_InitThreads
?
PyEval_ReleaseLock()
. GIL приобретен по уважительной причине; выпуск его перед вызовом других функций C API из Python приведет к сбою. - person Armin Rigo   schedule 17.02.2013