простая параллельная обработка в perl - PullRequest
5 голосов
/ 10 августа 2010

У меня есть несколько блоков кода внутри функции некоторого объекта, который может работать параллельно и ускорить процесс для меня.

Я пытался использовать subs::parallel следующим образом (все этонаходится в теле функции):

my $is_a_done = parallelize { 
                              # block a, do some work
                              return 1;
                             };
my $is_b_done = parallelize { 
                              # block b, do some work
                              return 1;
                             };
my $is_c_done = parallelize { 
                              # block c depends on a so let's wait (block)
                              if ($is_a_done) {
                               # do some work
                              };
                              return 1;
                             };
my $is_d_done = parallelize { 
                              # block d, do some work
                              return 1;
                             };

if ($is_a_done && $is_b_done && $is_c_done && $is_d_done) {
 # just wait for all to finish before the function returns
}

Во-первых, обратите внимание, что я использую if, чтобы дождаться блокировки потоков и дождаться завершения предыдущего потока, когда это необходимо (лучшая идея? * 1008)* довольно некрасиво ...).

Во-вторых, я получаю сообщение об ошибке:

Thread already joined at /usr/local/share/perl/5.10.1/subs/parallel.pm line 259.
Perl exited with active threads:
    1 running and unjoined
    -1 finished and unjoined
    3 running and detached

1 Ответ

13 голосов
/ 10 августа 2010

Я не видел subs::parallel раньше, но, учитывая, что он выполняет всю обработку потоков для вас, и, кажется, делает это неправильно , основываясь на сообщении об ошибке, я думаю, что это немного подозреваемый.

Обычно я бы не предложил просто так выбросить, но то, что вы делаете, на самом деле не так уж сложно: 1006 * сложнее с интерфейсом простых нитей, так почему бы не попробовать и упростить проблема немного? В то же время я дам вам ответ на другую часть вашего вопроса.

use threads;
my @jobs;
push @jobs, threads->create(sub {
  # do some work
});

push @jobs, threads->create(sub {
  # do some other work
});

# Repeat as necessary :)

$_->join for @jobs; # Wait for everything to finish.

Вам нужно что-то немного более запутанное, если вы используете возвращаемые значения из этих подпрограмм (простое переключение на хеш-функцию может помочь), но в предоставленном вами примере кода вы их игнорируете, что делает все просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...