perl中的简单并行处理

时间:2010-08-10 09:36:28

标签: perl parallel-processing

我有一些代码块,在某个对象的函数内部,可以并行运行并为我加速。

我尝试以下列方式使用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等待线程阻塞并等待前一个线程在需要时完成(更好的想法?if非常难看......)。

其次,我收到错误:

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 个答案:

答案 0 :(得分:13)

我之前没有见过subs::parallel,但鉴于它正在为您执行所有线程处理,并且它似乎正在根据错误消息执行错误,我认为这有点可疑。

通常情况下,我不会建议像这样抛出它,但是你所做的事实上并不是任何使用普通线程接口的更难,所以为什么不给它一个镜头,简化问题了一下?与此同时,我会回答你问题的其他部分。

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.

如果你使用那些sub的返回值(简单地切换到一个哈希值会有所帮助),你需要一些更复杂的东西但是在你提供的代码示例中,你忽略了它们,这使得事情很简单。