2010-02-09 10 views
9

que estoy haciendo un montón de llamadas al sistema que quiero correr en paralelo:En Perl, ¿cómo puedo bloquear para que finalicen un montón de llamadas al sistema?

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

// block here 

¿Cómo puedo bloquear el flujo del programa hasta que se hayan terminado todas las llamadas al sistema?

+0

¿El script padre perl necesita analizar el resultado? su publicación no implica ese requisito, pero cada vez que he tenido que hacer esto, la gestión de la salida también era un requisito. Usar magia abierta con tubos y seleccionar leerlos funcionó bien para mí. – ericslaw

Respuesta

9

la forma más sencilla de hacerlo es, probablemente, a fork un nuevo proceso hijo para cada llamada al sistema, y ​​luego esperar a que ellos para terminar. Aquí hay un ejemplo simplificado:

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

Perfecto. Sé que debería sufrir más y sintetizar la respuesta por mi cuenta ... pero mi perl está bastante oxidado. Gracias por este fragmento. –

+6

Inflaría el ejemplo, así que no quiero quejarme mucho, pero si 'fork' falla, devuelve' undef' que es falso, y luego este código hace lo incorrecto. Además, votaría por usar 'exec' en lugar de' system + exit' - Perl's 'exec' le permite darle una cadena completa para el shell como estos. – ephemient

4

Teclee un proceso secundario para realizar cada trabajo, y en el elemento primario, espere a que esos procesos finalicen antes de salir.

Ver perldoc perlfork, perldoc -f fork y perldoc -f waitpid.

(El código exacto para esto se deja como un ejercicio para el lector; todos deberían tener que escribir esto desde cero al menos una vez, para comprender los detalles involucrados. También hay muchos ejemplos en este sitio).

1

lo que acerca de la ejecución de cada una de la llamada al sistema de un hilo diferente y unirse en las roscas

+1

Los hilos rara vez son una buena idea en general, IME. Y son una idea especialmente ingrata en Perl, cuyos hilos son un dolor gigantesco en el culo. La solución 'fork 'es probablemente la mejor. – friedo

+0

La versión de Perl que estamos usando para mi proyecto no tiene soporte de "thread" y no uso mucho Perl así que no voy a intentar migrar nuestro proyecto. Gracias por la sugerencia, sin embargo. –

Cuestiones relacionadas