2013-08-28 3 views
1

Почему следующий код:Почему эта петля не работает так, как ожидалось?

#!/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'. Просто заметил, что ... – 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; ' будет оценивать значение 'false', так как pid из' $ pm-> start' будет 0 – Cratylus

+1

@Cratylus Это именно то, что он делает! Однако, поскольку 'start' возвращает ноль в дочернем элементе, который вы назначаете' $ pid', каждый ребенок печатает 'Hello 0'. Вы хотите использовать '$$' вместо этого, чтобы получить PID в дочернем элементе. – amon

-1

мой $ pid = $ pm-> start и next;

«и» логика будет оценивать значение true, если оба аргумента верны. Если первый аргумент является ложным, тогда логика «и» будет содержать ярлык и не будет оценивать второй аргумент

Возможно, вы захотите использовать «или» логику.

+0

'start and next' - правильное соглашение, используемое в документации Parallel :: ForkManager. – AKHolland

+0

@AKHolland, да corect. Но в этой документации предполагается, что программа хочет что-то сделать в дочернем процессе. Но в этом случае он хочет что-то сделать в родительском процессе (печать дочернего pid). – dwindura

Смежные вопросы