2010-06-07 11 views
6

La parte rilevante del codice simile a questo:La deposizione delle uova e in attesa di processi figlio in 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) 

Ciò dovrebbe fare è la deposizione delle uova tutti i processi off, quindi in attesa per ogni processo per terminare prima di continuare . Quello che fa è lavoro per la maggior parte, ma a volte si blocca nella sezione successiva (quando si aspetta che tutti questi processi siano finiti).

C'è qualcosa di sbagliato in questo? C'è un modo migliore per farlo?

L'ambiente su cui deve lavorare è CentOS con Python 2.4, ma sto testando su Cygwin con Python 2.5, quindi potrebbe essere che non funzioni sulla mia macchina ma funzionerà su quella Linux (la macchina Linux è molto lento e questo errore è raro, quindi non sono stato in grado di farlo lì).

risposta

5

il metodo consigliato per iniziare sottoprocesso è quello di utilizzare il modulo subprocess.

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

Suggerirei di installare python-subprocess32 - un backport robusta versione del modulo libreria standard subprocess, adatto per Python 2.4 a 2.7 di Python 3 di, e di gran lunga il modo migliore per eseguire sottoprocessi in Python 2. Quindi, nel ciclo farete

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

e il ciclo seguente sarà solo un semplice

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

Sono confuso sul perché avrei bisogno di installare quel modulo, quando 'subprocess.Popen()' funziona bene in Python 2.4 –

+0

@Brendan, correzioni di bug importanti, esp. per i programmi che utilizzano sia il sottoprocesso che i thread - che è menzionato nella pagina breve a cui ti ho indirizzato, è l'intero 2 ° paragrafo. C'è qualche ragione per cui hai bisogno della lista completa delle correzioni ...? Gestione EINTR, non più problemi con FD di grandi dimensioni, non più FD/gestire perdite ... –

+0

Oh capisco. Ho chiesto perché questo è un progetto di lavoro ed è molto più semplice se non devo installare nulla di nuovo. Grazie. –

Problemi correlati