Perl Parallel :: ForkManager wait_all_children () nimmt übermäßig lange Zeit
-
19-09-2019 - |
Frage
Ich habe ein Skript, das Parallel::ForkManager
verwendet. Allerdings dauert die wait_all_children () Prozess unglaublich lange Zeit, selbst nachdem alle Kind-Prozesse abgeschlossen sind. Die Art, wie ich weiß, ist, indem sie einige Zeitstempel Ausdrucken (siehe unten). Hat jemand eine Ahnung, was dies verursachen könnte (ich habe 16 CPU-Kern auf meinem Rechner)?
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";
Klar, ich werde die Waiting for some child process to finish
Nachricht zuerst erhalten, mit einem Zeitstempel von, sagen wir, 7:08:35
. Dann werde ich eine Liste von Process i completed
Nachrichten bekommen, mit der letzten in 7:10:30
. Allerdings habe ich keine Nachricht erhalten All Processes finished
bis 7:16:33
(!). Warum ist die 6-minütige Verzögerung von 7.10.30 bis 07.16.33? Thx!
Lösung
Ich habe versucht, dies:
#!/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;
Ich habe:
[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.
Ich habe auf Linux perl 5.10.1
mit Parallel :: ForkManager Version 0.7.5
.
Daher schließe ich, dass das, was Problem, das Sie als Folge haben geschehen, was geschieht, wenn Sie
# ... do something within the child-process ...
Update: Das Problem ist, Sie drucken die Process finished message
vor dem die finish
Anruf. Versuchen Sie, die folgende Version:
#!/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;
Siehe Rückrufe in Parallel :: ForkManager Dokumentation für weitere Informationen. Wenn die Verzögerung verschwindet, dann ist das Symptom Sie war beobachten aufgrund der Tatsache, dass Sie die gegabelten Prozess behaupteten beendet hatte, bevor es fertig war.