Когда вызывается PyEval_InitThreads?

Я немного смущен, когда я должен назвать PyEval_InitThreads . В общем, я понимаю, что PyEval_InitThreads нужно вызывать всякий раз, когда используется поток не-Python (то есть поток, который порождается в модуле расширения).

Однако я смущен, если PyEval_InitThreads предназначен для программ на языке C, которые PyEval_InitThreads интерпретатор Python или программы Python, которые импортируют модули расширения C или оба.

Итак, если я напишу модуль расширения C, который будет внутренне запускать поток, мне нужно вызвать PyEval_InitThreads при инициализации модуля?

Кроме того, PyEval_InitThreads неявно приобретает блокировку Global Interpreter . Поэтому, после вызова PyEval_InitThreads , предположительно, GIL должен быть выпущен или произойдет взаимоблокировка. Итак, как вы освобождаете замок? После прочтения документации PyEval_ReleaseLock() похоже, является способом выпуска GIL. Однако на практике, если я использую следующий код в модуле расширения C:

  PyEval_InitThreads(); PyEval_ReleaseLock(); 

… затем во время выполнения Python прерывает:

 Fatal Python error: drop_gil: GIL is not locked 

Итак, как вы освобождаете GIL после приобретения его с помощью PyEval_InitThreads ?

One Solution collect form web for “Когда вызывается PyEval_InitThreads?”

Большинство приложений никогда не должны знать о PyEval_InitThreads() вообще.

Единственный раз, когда вы должны использовать его, – это то, что ваше приложение внедрения или модуль расширения будет делать вызовы API Python C из более чем одного потока, который он породил сам за пределами Python.

Не вызывайте PyEval_ReleaseLock() в любом потоке, который позже будет создавать вызовы API Python C (если только вы не приобретете их ранее). В этом случае вам следует использовать макросы Py_BEGIN_ALLOW_THREADS и Py_END_ALLOW_THREADS .

  • Неустранимая ошибка: Python.h: Нет такого файла или каталога
  • Как вы компилируете расширения Python C / C ++ для разных ОС / версий Python?
  • AssertionError (только 3.X) при вызове Py_Finalize с потоками
  • Модуль расширения Python с переменным числом аргументов
  • Расширение python с помощью C: Передача списка в PyArg_ParseTuple
  • Как использовать Cython типизированные представления памяти для принятия строк из Python?
  • Передача 3-мерного массива numpy на C
  • Как использовать расширения C в python, чтобы обойти GIL
  • Расширения Python и OpenMP C
  • Передача функции C в функцию Python
  • Как сделать копию модуля python во время выполнения?
  • Python - лучший язык программирования в мире.