J'ai un processus principal qui crée deux sous-processus ou plus, je veux que le processus principal attende que tous les sous-processus terminent leurs opérations et se terminent?
# main_script.py
p1 = subprocess.Popen(['python script1.py'])
p2 = subprocess.Popen(['python script2.py'])
...
#wait main process until both p1, p2 finish
...
Un objet Popen
a une méthode .wait()
définie exactement pour cela: attendre la fin d'un sous-processus donné (et, en outre, le réaccord de son état de sortie) .
Si vous utilisez cette méthode, vous éviterez que les zombies de processus traînent trop longtemps.
(Vous pouvez également utiliser subprocess.call()
ou subprocess.check_call()
pour appeler et attendre. Si vous n'avez pas besoin de IO avec le processus, cela pourrait suffire. Mais ce n'est probablement pas une option, car votre si les deux sous-processus semblent être supposés fonctionner en parallèle, ce qu'ils ne feront pas avec (check_
)call()
.)
Si vous avez plusieurs sous-processus à attendre, vous pouvez faire
exit_codes = [p.wait() for p in p1, p2]
qui revient dès que tous les sous-processus sont terminés. Vous avez alors une liste de codes de retour que vous pouvez peut-être évaluer.
subprocess.call
Attend automatiquement, vous pouvez également utiliser:
p1.wait()