Вызов CPython из нескольких потоков

Я пытаюсь использовать pythonnet (библиотеку С#) из нескольких потоков, но он блокируется. Ниже приведена процедура вызова CPython из этой библиотеки:

Py_InitializeEx(0); // Initialize CPython
if (PyEval_ThreadsInitialized() == 0)
    PyEval_InitThreads();
// ---------------------------
gs = PyGILState_Ensure();
// Execute some Python code here
PyGILState_Release(gs);

Однако при повторном запуске этого из другого потока (не основного потока) он блокируется:

gs = PyGILState_Ensure(); // Deadlocks!
// Execute some Python code here
PyGILState_Release(gs);

Как правильно вызывать CPython из нескольких потоков?

Следующий вопрос:

Встраивание Python в многопоточное приложение C

кажется, связано, но я не разбираюсь в том, что такое «правильный» подход?


person HelloWorld    schedule 17.10.2019    source источник
comment
GIL — это глобальная блокировка интерпретатора. У вас не может быть двух потоков, выполняющих код Python одновременно.   -  person Botje    schedule 17.10.2019
comment
@Botje Я знаю это, но, насколько я понимаю, GIL - это блокировка - мьютекс, цель которой - предотвратить это. Он должен блокировать, но не блокировать.   -  person HelloWorld    schedule 17.10.2019
comment
Как вы диагностировали это как тупик? Это включает в себя два потока, удерживающих блокировки, ожидающих разблокировки блокировок друг друга.   -  person Botje    schedule 18.10.2019