Вызов Py_Initialize() в нескольких потоках
Я встраиваю Python в многопоточное приложение C++, это безопасно вызывать Py_Initialize()
в несколько потоков? Или я должен назвать это в главной теме?
1 ответ
Py_Initialize()
код содержит:
if (initialized)
return;
initialized = 1;
Документация для функции также говорит:
Это не работает, когда вызывается во второй раз (без вызова Py_Finalize() сначала).
Хотя я рекомендую вам делать это только из основного потока, хотя в зависимости от того, что вы делаете, это может усложниться.
Проблема в том, что обработчики сигналов запускаются только в контексте основного потока Python. То есть, какую нить вызывать Py_Initialize()
, Так что, если это временный поток и используется только один раз, а затем отбрасывается, то нет никакой возможности вызвать обработчики сигналов. Таким образом, вы должны подумать о том, как вы обрабатываете сигналы.
Также будьте осторожны с использованием большого количества временных потоков, созданных в коде C, с использованием нативного API потоков и обращением к интерпретатору Python, поскольку каждый из них создаст данные в интерпретаторе Python. Это будет накапливаться, если продолжать создавать и отбрасывать эти внешние потоки. Вы должны стараться использовать пул потоков вместо того, чтобы вызывать внешние потоки, и продолжать повторное использование предыдущих потоков.