Я немного смущен, когда я должен позвонить PyEval_InitThreads
. В общем, я понимаю, что PyEval_InitThreads
должен вызываться всякий раз, когда используется поток не-Python (т. Е. Поток, который порождается в модуле расширения).Когда вызывается PyEval_InitThreads?
Однако я смущен, если PyEval_InitThreads
предназначен для программ на языке C, которые включают интерпретатор Python или программы Python, которые импортируют модули C-расширения или и то, и другое.
Итак, если я пишу модуль расширения C, который будет внутренне запускать поток, мне нужно вызвать PyEval_InitThreads
при инициализации модуля?
Также, PyEval_InitThreads
implicitly acquires the Global Interpreter Lock. Поэтому, после звонка 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 приобретается по уважительной причине; выпуская его перед вызовом других функций API C из Python. –