2010-02-09 9 views
9

sto facendo un sacco di chiamate di sistema che voglio correre in parallelo:In Perl, come posso bloccare il completamento di un gruppo di chiamate di sistema?

system(" sleep 5 && echo step 1 done &"); 
system(" sleep 3 && echo step 2 done &"); 
system(" sleep 7 && echo step 3 done &"); 

// block here 

Come posso bloccare il flusso del programma fino a quando tutte le chiamate di sistema sono finiti?

+0

lo script padre perl deve analizzare l'output? il tuo post non implica quel requisito, ma ogni volta che ho dovuto farlo, la gestione dell'output era anche un requisito. Usare la magia aperta con le pipe e selezionare di leggerle ha funzionato bene per me. – ericslaw

risposta

9

il modo più semplice per farlo è probabilmente quello di fork un nuovo processo figlio per ogni chiamata di sistema, e quindi attendere per loro finire. Ecco un esempio semplificato:

my @commands = ("sleep 5 && echo step 1 done", 
       "sleep 3 && echo step 2 done", 
       "sleep 7 && echo step 3 done"); 

my @pids; 
foreach my $cmd(@commands) { 
    my $pid = fork; 
    if ($pid) { 
     # parent process 
     push @pids, $pid; 
     next; 
    } 

    # now we're in the child 
    system($cmd); 
    exit;   # terminate the child 
} 

wait for @pids; # wait for each child to terminate 

print "all done.\n"; 
+0

Perfetto. So che dovrei soffrire di più e sintetizzare la risposta da solo ... ma il mio perl è piuttosto arrugginito. Grazie per questo frammento. –

+6

Esploderebbe l'esempio quindi non voglio lamentarmi molto, ma se 'fork' fallisce, restituisce' undef' che è falso, e quindi questo codice fa la cosa sbagliata. Inoltre, voterei per usare 'exec' invece di' system + exit' - Perl 'exec' ti permette di dargli una stringa completa per la shell come questi. – ephemient

4

Forcella di un processo figlio per eseguire ogni processo e nel genitore, attendere il termine di tali processi prima di uscire.

Vedere perldoc perlfork, perldoc -f fork e perldoc -f waitpid.

(Il codice esatto per questo è lasciato come esercizio per il lettore - tutti dovrebbero scrivere questo da zero almeno una volta, per capire i dettagli coinvolti. Ci sono molti esempi anche in questo sito.)

1

quello di rimanere a corto ognuno di chiamata di sistema da un thread diverso e di unirsi a filetti

+1

I thread raramente sono una buona idea in generale, IME. E sono un'idea particolarmente buona in Perl, i cui fili sono un gigantesco rompiscatole. La soluzione 'fork' è probabilmente la migliore. – friedo

+0

La versione perl che stiamo usando per il mio progetto non ha il supporto "thread" e non uso perl molto così non avrò intenzione di provare a migrare il nostro progetto. Grazie per il suggerimento però. –

Problemi correlati