2010-06-07 3 views
6

La partie pertinente du code ressemble à ceci:Frai et d'attendre les processus enfants en Python

pids = [] 
for size in SIZES: 
    pids.append(os.spawnv(os.P_NOWAIT, RESIZECMD, [RESIZECMD, lotsOfOptions])) 

# Wait for all spawned imagemagick processes to finish 
while pids: 
    (pid, status) = os.waitpid(0, 0) 
    if pid: 
     pids.remove(pid) 

Ce que cela devrait faire fraie tous les processus au large, puis d'attendre pour chaque processus pour terminer avant de poursuivre . Ce que cela fait, c'est travailler pour la plupart, mais parfois tomber en panne sur la section suivante (quand il s'attend à ce que tous ces processus soient terminés).

Y at-il quelque chose qui ne va pas? Y a-t-il une meilleure façon de le faire? L'environnement sur lequel il doit travailler est CentOS avec Python 2.4, mais je suis en train de tester sur Cygwin avec Python 2.5, il se peut donc qu'il échoue sur ma machine mais fonctionne sur Linux (la machine Linux est très lent et cette erreur est rare, donc je n'ai pas pu l'obtenir là-bas).

Répondre

5

la méthode recommandée pour démarrer sous-processus d'utiliser le module subprocess.

pipe = Popen(["program", "arg1", "arg2"]) 
pipe.wait() 
3

Je recommande l'installation python-subprocess32 - une backport robuste de la version de Python 3 du module de bibliothèque standard subprocess, adapté pour Python 2.4 à 2.7, et de loin la meilleure façon d'exécuter des sous-processus en Python 2. Ensuite, dans le boucle que vous allez faire

pids.append(subprocess.Popen([RESIZECMD, lot, of, options]) 

et la boucle suivante sera juste un simple,

for pid in pids: 
    pid.wait() 
+0

Je suis confus au sujet de pourquoi je besoin d'installer ce module lorsque 'subprocess.Popen()' fonctionne très bien en Python 2.4 –

+0

@Brendan, corrections de bugs importants, esp. pour les programmes qui utilisent à la fois les sous-processus et les threads - cela est mentionné sur la courte page que je vous ai indiquée, c'est tout le 2ème paragraphe. Y a-t-il une raison pour laquelle vous avez besoin de la liste complète des correctifs ...? Manipulation EINTR, plus de problèmes avec les grandes FD, plus de fuites FD/poignée ... –

+0

Oh je vois. J'ai demandé parce que c'est un projet de travail et c'est beaucoup plus facile si je n'ai pas besoin d'installer quelque chose de nouveau. Merci. –

Questions connexes