2013-08-28 118 views
1

爲什麼下面的代碼:爲什麼這個fork循環沒有按預期工作?

#!/usr/bin/perl 
use strict; 
use warnings; 
use Parallel::ForkManager; 

my $pm = new Parallel::ForkManager(5); 

my @all_data = ('a','b','c','d','e','f'); 

foreach my $data (@all_data) { 
    # Forks and returns the pid for the child: 
    my $pid = $pm->start and next; 
    print "Hello $pid\n"; 
    $pm->finish; # Terminates the child process 
} 
$pm->wait_all_children; 

打印:

Hello 0 
Hello 0 
Hello 0 
Hello 0 
Hello 0 

我新的Perl和我試圖趕上在Perl

多處理
+0

我在Windows上使用'#!/ usr/bin/perl'.Just注意到... – Cratylus

回答

2

docs for the start method

此方法執行分叉。它返回父進程的子進程的PID,併爲子進程返回0。

當它發生時,fork功能不一樣的,這就是爲什麼start反映它。

父可能需要子PID控制子 - 經由$$可變但孩子知道其自己的PID - 發送信號和東西:

foreach my $data (@all_data) { 
    $pm->start and next; 
    print "Hello $$\n"; 
    $pm->finish; 
} 

輸出示例:

Hello 22215 
Hello 22218 
Hello 22219 
Hello 22217 
Hello 22220 
Hello 22216 
+0

這段代碼來自http://search.cpan.org/~dlux/Parallel-ForkManager-0.7 0.5/ForkManager.pm。我的理解是,'$ pm-> start和next;'會爲父項執行'next'(因爲ppid! - 0),即自$ pm-> start和next之後繼續分支並執行子項的打印。因爲從$ pm-> start'的pid會是0 – Cratylus

+1

@Cratylus,所以它會評估爲'false'這正是它的功能!然而,因爲'start'在你賦給'$ pid'的子元素中返回零,所以每個子元素都輸出'Hello 0'。你想用'$$'來獲得孩子的PID。 – amon

-1

我的$ pid = $ pm->開始和下一個;

「和」如果兩個參數都爲真,則邏輯將評估爲真。如果第一個參數爲false,則「and」邏輯將快捷,並且不會評估第二個參數。

您可能想使用「或」邏輯。

+0

「開始和下一個」是在Parallel :: ForkManager文檔中使用的正確慣例。 – AKHolland

+0

@AKHolland,是的corect。但是那個文檔假定程序想要在子進程中做一些事情。但是在這種情況下,它想要在父進程中執行一些操作(打印子PID)。 – dwindura

相關問題