У меня возникли некоторые проблемы при использовании subprocess.Popen ()
для создания нескольких экземпляров одного и того же приложения из моего скрипта python с использованием потоков, чтобы они работали одновременно. В каждом потоке я запускаю приложение с помощью вызова popen ()
, а затем жду его завершения, вызывая wait ()
. Проблема, похоже, в том, что вызов wait ()
на самом деле не ожидает завершения процесса. Я экспериментировал, используя только один поток и распечатывая текстовые сообщения, когда процесс начинается и когда он заканчивается. Таким образом, функция потока будет выглядеть примерно так:
def worker():
while True:
job = q.get() # q is a global Queue of jobs
print('Starting process %d' % job['id'])
proc = subprocess.Popen(job['cmd'], shell=True)
proc.wait()
print('Finished process %d' % job['id'])
job.task_done()
Но даже когда я использую только один поток, он распечатает несколько сообщений «Запуск процесса ...», прежде чем появится какое-либо сообщение «Завершенный процесс ...». Есть ли случаи, когда wait ()
на самом деле не ждет? У меня есть несколько разных внешних приложений (консольные приложения C ++), которые, в свою очередь, будут иметь несколько экземпляров, работающих одновременно, и для некоторых из них мой код работает, а для других - нет. Может быть проблема с внешними приложениями, которая каким-то образом влияет на вызов wait ()
?
Код для создания потоков выглядит примерно так:
for i in range(1):
t = Thread(target=worker)
t.daemon = True
t.start()
q.join() # Wait for the queue to empty
Обновление 1 :
Я также должен добавить, что для некоторых внешних приложений я иногда получаю код возврата ( proc.returncode
) -1073471801. Например, одно из внешних приложений выдаст этот код возврата первые два раза Вызывается Popen
, но не последние два раза (когда у меня четыре задания).
Обновление 2 :
Чтобы прояснить ситуацию, сейчас у меня в очереди четыре задания, которые представляют собой четыре разных тестовых примера. Когда я запускаю свой код, для одного из внешних приложений первые два вызова Popen
генерируют код возврата -1073471801. Но если я напечатаю точную команду, которую вызывает Popen
, и запустил ее в командном окне, она выполнится без проблем.
Решено! Мне удалось решить возникшие у меня проблемы. Думаю, проблема заключалась в отсутствии у меня опыта в многопоточном программировании. Я упустил тот факт, что, когда я создал свои первые рабочие потоки, они продолжали жить, пока скрипт python не завершился. По ошибке я создавал больше рабочих потоков каждый раз, когда помещал новые элементы в очередь (я делаю это партиями для каждой внешней программы, которую хочу запустить). Итак, к тому времени, когда я добрался до четвертого внешнего приложения, у меня было четыре потока, работающих одновременно, хотя я думал, что у меня есть только один.