Question

J'ai un script qui utilise Parallel::ForkManager. Cependant, le processus wait_all_children () prend du temps incroyablement long, même après tous les enfants-processus sont terminés. La façon dont je sais est en imprimant quelques horodatages (voir ci-dessous). Est-ce que quelqu'un a une idée de ce qui pourrait être la cause (je 16 cœurs de processeur sur ma machine)?

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

Il est clair que je reçois le message d'Waiting for some child process to finish d'abord, avec un horodatage, disons, 7:08:35. Alors, je vais obtenir une liste des messages Process i completed, le dernier à 7:10:30. Cependant, je ne reçois pas le All Processes finished de message jusqu'à ce que 7:16:33 (!). Pourquoi est-ce délai de 6 minutes entre 7:10:30 et 7:16:33? Thx!

Était-ce utile?

La solution

J'ai essayé ceci:

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

Je suis:

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

Je perl 5.10.1 sur Linux avec parallèle :: Version ForkManager 0.7.5.

Par conséquent, je conclus que tout problème que vous rencontrez se passe en conséquence de ce qui se passe lorsque vous

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

Mise à jour: Le problème est, vous imprimez la Process finished message avant l'appel finish. Essayez la version suivante:

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

Voir en parallèle :: Callbacks documentation ForkManager pour plus d'informations. Si le retard disparaît, alors le symptôme que vous observez est dû au fait que vous réclamez le processus fourchue avait fini avant qu'il ne soit fait.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top