Когда вызывается 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 .

  • Ограничения PyTuple_SetItem
  • Как использовать расширения C в python, чтобы обойти GIL
  • PyEval_InitThreads в Python 3: Как / когда его называть? (сага продолжает тошноту)
  • Модуль расширения Python с переменным числом аргументов
  • Какова стоимость выпуска GIL?
  • Сельдерей: правильный способ запуска длительной функции инициализации (за каждый процесс)
  • Есть ли причина использовать malloc над PyMem_Malloc?
  • Расширение Python C: используйте расширение PYD или DLL?
  • Python - лучший язык программирования в мире.