Не ждите подпроцессов, а проверяйте код возврата позже

Я работаю над сценарием, который запускает ряд подпроцессов. Сценарий должен иметь возможность запускать их все, а затем проверять в цикле, выполнены ли они.

Не начинайте одну, подождите, пока она закончится, а затем начните следующую.

Например:

sp1 = subprocess.Popen(["sleep 60", shell=True)
sp2 = subprocess.Popen(["sleep 10", shell=True)
sp3 = subprocess.Popen(["sleep 80", shell=True)

sp1_done = False
sp2_done = False
sp3_done = False
while not sp1_done and not sp2_done and not sp3_done:
    if sp1.returncode and not sp1_done:
        print("sp1 done")
        sp1_done = True
    if sp2.returncode and not sp2_done:
        print("sp2 done")
        sp2_done = True
    if sp3.returncode and not sp3_done:
        print("sp3 done")
        sp3_done = True

print("all done")

Я читал, что можно получить доступ к коду ошибки подпроцесса с помощью

sp1_data = sp1.communicate()[0] и затем с

returncode = sp1.returncode

Но вот так скрипт ждет завершения sp1.

Как я могу запустить несколько подпроцессов, не дожидаясь их завершения, а проверяя, завершены ли они (например, проверив код возврата)?


person SaAtomic    schedule 15.12.2016    source источник
comment
вы можете создать 1 поток на процесс и запустить subprocess.Popen оттуда. Кстати, хорошая картинка с амигой.   -  person Jean-François Fabre    schedule 15.12.2016
comment
У меня нет опыта работы с потоками Python, но я посмотрю на это, спасибо, чувак! ха-ха - да! Это красота!   -  person SaAtomic    schedule 15.12.2016
comment
Чтобы уточнить то, что сказал Жан-Франсуа Фабр, попробуйте использовать встроенную библиотеку потоков (на самом деле я думаю, что это _thread в Python 3). Вы используете thread.start_new для запуска нового потока. Это очень простая библиотека для сложной концепции. Попробуйте поискать в Google документацию по потоку Python.   -  person Douglas    schedule 15.12.2016


Ответы (1)


Вам нужно использовать метод опроса для каждого запущенного подпроцесса. И проверьте, что код возврата не None:

 while ....  # as written
     sp1.poll()
     sp2.poll()
     sp3.poll()
     if sp1.returncode is not None and not sp1_done:
          .... # as written
     ... # as written
person John F    schedule 15.12.2016
comment
Работает по назначению! Но мне придется подумать о реализации потоков, как предлагали другие. - person SaAtomic; 15.12.2016