2009-10-14 2 views
3
use Parallel::ForkManager; 
    use LWP::Simple; 
    my $pm=new Parallel::ForkManager(10); 
    our $a =0; 
@LINK=(10,203, 20, 20 ,20 ,10 ,101 ,01 ,10) ; 
    for my $link (@LINK) { 
    $pm->start and next; 
    my $lo = ($link * 120.22)*12121.2121212121212121*(12121212.1212121+ $link); 
    $a = $a+ $lo ; 
    print $a."\n" ; 
    $pm->finish; 
    }; 

    print $a ; 

Я пытался получить доступ к глобальной переменной при параллельном процессе, используя параллельный модуль менеджера fork. конец программы глобальная переменная все еще остается такой же .. как этого достичь? возможно ли это?Как Perl может совместно использовать глобальные переменные при параллельной обработке?

+0

Почему вы хотите изменить переменные? Меняют ли они после запуска процесса? –

ответ

3

Если программа не начинали параллельные процессы, то проблема будет со вторым

my $a = 0; 

линией.

Однако, поскольку вы начинаете параллельные процессы, каждый $a будет находиться в его памяти. Это означает, что каждый $a является копией первого $a. И последнее из первых $a никогда не изменится, из-за этого.

Получение значения от одного процесса к другому процессу требует немного межпроцессного взаимодействия. Это можно сделать с помощью розетки или IPC или какой-либо другой механизм.

+0

жаль, что я отредактировал еще раз – joe

+0

@joe, ваше редактирование ничего не меняет. Объем $ a все тот же. Regardl проблема моего или нашего, проблема МПК остается. Ваши разветвленные процессы выполняют свою работу без сохранения результатов в любом месте, которые могут быть сохранены после их завершения. – EmFi

+1

Ваши изменения не имеют значения, потому что вы используете forking, все переменные находятся в разных процессах. –

9

Это не вопрос оценки, это вопрос разных процессов. Parallel::ForkManager использует fork() (отсюда и название). Это означает, что каждая версия, работающая параллельно, фактически является отдельным процессом (отдельным вызовом интерпретатора perl) и, следовательно, отдельной памятью. Переменные будут иметь одно и то же имя в каждом процессе, но они не будут указывать на то же место в памяти.

Если вы хотите, чтобы разделять переменные через параллельные рабочие, то вам нужно смотреть на либо с использованием потоков (которые я бы не рекомендовал) или с помощью какой-то IPC (межпроцессного связи), как IPC::Shareable

0

Trick I used - сохраняйте каждую переменную внутри процесса fork в отдельный файл txt, чем в конце (после fork), просто пройдите через все файлы и соберите их (вы можете удалить файлы, если они не нужны.

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