Вызов Py_Initialize() в нескольких потоках

Я встраиваю Python в многопоточное приложение C++, это безопасно вызывать Py_Initialize() в несколько потоков? Или я должен назвать это в главной теме?

1 ответ

Py_Initialize() код содержит:

if (initialized)
    return;
initialized = 1;

Документация для функции также говорит:

Это не работает, когда вызывается во второй раз (без вызова Py_Finalize() сначала).

Хотя я рекомендую вам делать это только из основного потока, хотя в зависимости от того, что вы делаете, это может усложниться.

Проблема в том, что обработчики сигналов запускаются только в контексте основного потока Python. То есть, какую нить вызывать Py_Initialize(), Так что, если это временный поток и используется только один раз, а затем отбрасывается, то нет никакой возможности вызвать обработчики сигналов. Таким образом, вы должны подумать о том, как вы обрабатываете сигналы.

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

Другие вопросы по тегам