У меня есть проект Python 3.7
Он использует библиотеку, которая использует подпроцесс Popen
для вызова сценария оболочки.
Мне интересно: если бы я поместил вызовы библиотеки в отдельный поток, смог бы ли я выполнять работу в основном потоке, ожидая результата от Popen
в другом потоке?
Здесь есть ответ https://stackoverflow.com/a/33352871/202168, который говорит:
Потоки Python работают с GIL с помощью простого счетчика.
С каждыми выполненными 100-байтовыми кодами предполагается выпуск GIL
потоком, выполняющимся в настоящее время, чтобы дать другим потокам
шанс выполнить код. Это поведение по существу нарушено в Python
2.7 из-за механизма освобождения / захвата потока. Это было исправлено в Python 3.
В любом случае, звучит не особенно обнадеживающе за то, что я хочу сделать. Похоже, если поток «библиотечные вызовы» не достиг точки запуска с 100-байтовым кодом при выполнении вызова Popen.wait
, то, вероятно, он не переключится на другой мой поток, и все приложение будет ожидать подпроцесс?
Возможно, эта информация неверна.
Вот еще один ответ https://stackoverflow.com/a/16262657/202168, который говорит:
... переводчик всегда может выпустить GIL; это даст это некоторым
другой поток после того, как он интерпретировал достаточно инструкций, или
автоматически, если это делает некоторый ввод / вывод. Обратите внимание, что с недавнего Python 3.x,
критерии больше не основаны на количестве выполненных
инструкции, но относительно того, прошло ли достаточно времени.
Это звучит более обнадеживающе, поскольку предположительно связь с подпроцессом потребует ввода-вывода и, следовательно, может позволить переключению контекста для моего основного потока, чтобы он мог продолжаться в это время. (или, возможно, только что прошедшее время ожидания на wait
вызовет переключение контекста)
Мне известно о https://docs.python.org/3/library/asyncio-subprocess.html, который явно решает эту проблему, но я вызываю стороннюю библиотеку, которая просто использует простой subprocess.Popen
.
Может ли кто-нибудь подтвердить, может ли идея "вызовы подпроцесса в отдельном потоке" быть мне полезной, особенно в Python 3.7?