Встроенный Python (3.10) - py_finalizeex висит/тупик на "Threading._shutdown ()"C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Встроенный Python (3.10) - py_finalizeex висит/тупик на "Threading._shutdown ()"

Сообщение Anonymous »

Я внедряю Python в приложение C ++, и я думаю, что у меня возникает некоторая путаница с pygilstate_ensure/pygilstate_release , которая в конечном итоге приводит к py_finalizeex , чтобы вешать в потоке. потоки.

Код: Выделить всё

Py_InitializeEx(0); // Skip installing signal handlers
auto gil = PyGILState_Ensure();
// ... running Python code
PyGILState_Release(gil);
всякий раз, когда в положении используется Python (может быть несколько C-Threads), я использую pyscope в начале функции:

Код: Выделить всё

#define pyscope() \
PyGILState_STATE gstate = PyGILState_Ensure(); \
utils::scope_guard sggstate([&]() \
{ \
PyGILState_Release(gstate); \
});
< /code>
Когда я хочу освободить Python, я звоню (из C-thread, не обязательно тот, кто инициализировал Python): < /p>
PyGILState_STATE gstate = PyGILState_Ensure();
int res = Py_FinalizeEx(); // 
Отладка и чтение кода раскрыло, что он висит во время присоединения потоков. Я могу воспроизвести тупик, запустив следующий код с помощью Pyrun_simplestring 
(запустив его прямо перед py_finalizeex):

Код: Выделить всё

import threading
for t in threading.enumerate():
print('get_ident: {} ; native: {}'.format(t.ident, t.native_id))
if not threading.current_thread().ident == t.ident:
t.join()
Последнее, я не использую pyeval_savethread/restoreThread, возможно, мне нужно, но я не понимаю, как использовать их с Gil_ensure/Release, как я видел, что они внутренне также принимают и сбрасывают Gil.>

Подробнее здесь: https://stackoverflow.com/questions/758 ... g-shutdown
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»