Pregunta

Tengo un script que usa Parallel::ForkManager. Sin embargo, el proceso wait_all_children () toma increíblemente largo tiempo, incluso después se hayan completado todos los procesos-niño. La manera en que sé es mediante la impresión de algunas marcas de tiempo (véase más adelante). ¿Alguien tiene alguna idea de lo que podría estar causando esto (tengo 16 núcleos de CPU en mi máquina)?

my $pm = Parallel::ForkManager->new(16);
for my $i (1..16) {
    $pm->start($i) and next;

    ... do something within the child-process ...

    print (scalar localtime), " Process $i completed.\n";
    $pm->finish();
}
print (scalar localtime), " Waiting for some child process to finish.\n"; 
$pm->wait_all_children();
print (scalar localtime), " All processes finished.\n"; 

Está claro que voy a conseguir el mensaje Waiting for some child process to finish primero, con una marca de tiempo de, por ejemplo, 7:08:35. A continuación, voy a conseguir una lista de mensajes Process i completed, con el último a las 7:10:30. Sin embargo, no recibo el mensaje hasta All Processes finished 7:16:33 (!). ¿Por qué es que el retraso de 6 minutos 07:10:30-07:16:33? Thx!

¿Fue útil?

Solución

He intentado esto:

#!/opt/perl/bin/perl

use strict; use warnings;

use Parallel::ForkManager;

my $pm = Parallel::ForkManager->new(16);

for my $i (1..16) {
    $pm->start($i) and next;
    sleep rand 20;
    printf "%s : Process %d completed\n", scalar localtime, $i;
    $pm->finish;
}

printf "%s: Waiting for some child to finish\n", scalar localtime;
$pm->wait_all_children;

printf "%s: All processes finished.\n", scalar localtime; 

Tengo:

[sinan@archardy Src]$ ./y.pl
Thu Mar 11 17:14:16 2010 : Process 3 completed
Thu Mar 11 17:14:16 2010: Waiting for some child to finish
Thu Mar 11 17:14:18 2010 : Process 8 completed
Thu Mar 11 17:14:18 2010 : Process 14 completed
<snip>...</snip>
Thu Mar 11 17:14:34 2010 : Process 12 completed
Thu Mar 11 17:14:34 2010: All processes finished.

He perl 5.10.1 en Linux con paralelo :: ForkManager versión 0.7.5.

Por lo tanto, llego a la conclusión de que cualquier problema que está teniendo que sucede como consecuencia de lo que sucede cuando

# ... do something within the child-process ...

Actualización: El problema es que está imprimiendo la Process finished message antes de la llamada del finish. Prueba la versión siguiente:

#!/opt/perl/bin/perl

use strict; use warnings;

use Parallel::ForkManager;

my $pm = Parallel::ForkManager->new(16);
$pm->run_on_finish( sub {
    printf "%s : Process completed: @_\n", scalar localtime
});

for my $i (1..16) {
    $pm->start($i) and next;
    sleep rand 20;
    $pm->finish;
}

printf "%s: Waiting for some child to finish\n", scalar localtime;
$pm->wait_all_children;

printf "%s: All processes finished.\n", scalar localtime;

devoluciones de llamada en paralelo :: ForkManager documentación para más información. Si el retraso desaparece, entonces el síntoma que se está observando se debió al hecho de que estaban reclamando el proceso de horquilla había terminado antes de que se hizo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top