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!

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top