質問

私はスクリプトを使用する Parallel::ForkManager.しかし、wait_all_children()処理が非常に長く、時間もすべての子プロセスは完了です。はいは印刷の一部タイムスタンプします(下記参照)。んていうか、ビルギッタがなぜ起こしてくれてありがとうございます16CPUコアマ)?

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

明らかにないの Waiting for some child process to finish メッセージ、タイムスタンプのもの 7:08:35.そして私の一覧を取得し Process i completed メッセージ、最後の一つで 7:10:30.しかしながら、メッセージを受け取り All Processes finished まで 7:16:33(!).どうしてでしょうか?6分遅れの7:10:30-7:16:33?Thx!

役に立ちましたか?

解決

やってみると:

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

ん:

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

していま perl 5.10.1 Linux 並列::ForkManager0.7.5.

そのため、こう問題を利用する際に何が起こっているの結果としてるとどうなるか、試してみなさい

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

更新: 問題は、印刷の Process finished message 前の finish ます。次のことを試してみてくださいバージョン:

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

コールバック並列::ForkManager書 ます。場合には遅延が消え、その症状が見られるよう、という事実が請求の短工程で完成させたものでした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top