Я пытаюсь написать класс C++, который вызывает методы Python класса, который выполняет некоторые операции ввода-вывода (файл, stdout) сразу. Проблема, с которой я столкнулся, заключается в том, что мой класс вызывается из разных потоков: иногда основной поток, а иногда и другие. Очевидно, я попытался применить подход для вызовов Python в многопоточных приложениях. В основном все начинается с PyEval_AcquireLock и PyEval_ReleaseLock или только с глобальными замками. Согласно документации here, когда нить уже заблокирована, наступает тупик. Когда мой класс вызывается из основного потока или другого, который блокирует выполнение Python, у меня есть тупик.Python C API из приложения C++ - знать, когда блокировать
Python> Cfunc1() - C++ FUNC, что создает потоки внутренне, которые приводят к призывам в «мой класс», Он застрял на PyEval_AcquireLock, очевидно, Python уже заблокирован, т.е. ожидание C++ Cfunc1 вызов завершить ... Это отлично, если я опускаю эти блокировки. Также он отлично подходит, когда интерпретатор Python готов для следующей пользовательской команды, то есть когда поток вызывает funcs в фоновом режиме, а не внутри собственного вызова
Я ищу обходное решение. Мне нужно различать, разрешена ли глобальная блокировка, то есть Python не заблокирован и готов принять следующую команду ... Я попытался PyGIL_Ensure, к сожалению, вижу зависание.
Любой известный API или решение для этого?
(Python 2.4)
У вас есть какой-то насос сообщений, куда вы отправляете сообщения, которые обрабатываются в основном потоке? – kibibu
Можете ли вы объяснить, как возникают нитки? Являются ли они порождены через API Python? –