подпроцесс. wait (), не дожидаясь завершения процесса Popen (при использовании потоков)?

У меня возникли некоторые проблемы при использовании 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 не завершился. По ошибке я создавал больше рабочих потоков каждый раз, когда помещал новые элементы в очередь (я делаю это партиями для каждой внешней программы, которую хочу запустить). Итак, к тому времени, когда я добрался до четвертого внешнего приложения, у меня было четыре потока, работающих одновременно, хотя я думал, что у меня есть только один.

19
задан iceaway 14 June 2011 в 11:20
поделиться