Domanda

Ho uno script che utilizza Parallel::ForkManager. Tuttavia, il processo wait_all_children () prende tempo incredibilmente lungo, anche dopo tutti i processi figlio sono stati completati. Il modo che conosco è stampando alcuni timestamp (vedi sotto). Qualcuno ha idea di cosa potrebbe causare questo (ho 16 core di CPU sulla mia macchina)?

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"; 

Chiaramente, vado a prendere il messaggio Waiting for some child process to finish prima, con un timestamp di, diciamo, 7:08:35. Poi avrò un elenco di messaggi Process i completed, con l'ultimo alle 7:10:30. Tuttavia, non ricevo il messaggio All Processes finished fino 7:16:33 (!). Perché è che il ritardo di 6 minuti 7:10:30-07:16:33? Thx!

È stato utile?

Soluzione

Ho provato questo:

#!/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; 

ho ottenuto:

[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.

Ho perl 5.10.1 su Linux con Parallel :: ForkManager versione 0.7.5.

Pertanto, concludo che qualsiasi problema si stanno avendo sta accadendo come una conseguenza di ciò che accade quando si

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

Aggiornamento: Il problema è che si sta stampando la Process finished message prima della chiamata della finish. Provare la seguente versione:

#!/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;

Per ulteriori informazioni vedere richiamate in parallelo :: ForkManager documentazione . Se il ritardo scompare, allora il sintomo che si sta osservando è dovuta al fatto che si stava sostenendo il processo biforcuta aveva finito prima che fosse fatto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top