2011-07-04 65 views
2

我想讓子進程寫入父類的@array。我讀過有關管道,但我對如何真正實現它很困惑:如何使用Parallel :: ForkManager管道?

use Parallel::ForkManager; 
my @array; 
my $pm=new Parallel::ForkManager(3); 

    for((1..5)){ 
    $pm->start and next; 
    print "child: ".$_."\n"; 
    push(@array,$_); # what do I do here to put it into the parent's @array???? 
    $pm->finish; 
    } 
$pm->wait_all_children; 


print "parent: ".$_."\n" for @array; 

回答

9

如果你想使用管道,那麼你需要你每次產卵前兒童打造一雙管道,寫來自孩子的書寫管,並且使用IO::Select在母體中並行讀取所有閱讀結束。你還需要改變你等待孩子的方式,因爲ForkManager的wait_all_children被阻塞,這不是很有用。您可以使用run_on_start方法在散列中註冊每個進程,並使用run_on_finish方法刪除每個進程死後的每個進程,然後在沒有進程剩餘時終止選擇循環。

或者,如果孩子們能夠通過他們的結果反饋給家長實時這並不重要,你可以使用ForkManager的通過finish通話將數據傳回給母公司的出口,這看起來是這樣的能力:

#!perl 
use strict; 
use warnings; 
use Parallel::ForkManager; 

# No indirect object notation 
my $pm = Parallel::ForkManager->new(3); 
my @array; 
$pm->run_on_finish(sub { 
    my $return = $_[5]; # Count 'em. 
    push @array, @$return; 
}); 

for(1..5) { 
    $pm->start and next; 
    print "child: $_\n"; 
    $pm->finish(0, [$_]); 
} 

$pm->wait_all_children; 

print "parent: $_\n" for @array; 

這實際上工作。

+0

不錯;完成的第二個參數是新的,而不是在我已經安裝的舊版本中,但它很有意義,這個功能被合併到P :: FM本身中。 – ysth

+0

我完全反映了ysth的情緒。有人在我最近看到的部分代碼中使用了第二個參數,但我並不知道P :: FM本身正在處理它。上次我看着P :: FM時,它不存在。謝謝! – ikegami

+0

真正有用的答案 - 謝謝。值得注意的是,run_on_finish中sub的第5個參數總是包含數據結構。我的($ pid,$ exit_code,$ ident,$ exit_signal,$ core_dump,$ data_structure_reference)= @_; – hardingnj

相關問題