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

我尝试通过以下方式使用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

最佳答案

我以前没有看过subs::parallel,但是鉴于它正在为您执行所有线程处理,并且根据错误消息看来似乎做错了,我认为这有点怀疑。

通常,我不会只是建议像那样扔掉它,但是使用纯线程接口(interface)确实不会给您带来什么困难,所以为什么不花点时间并稍微简化一下问题呢?同时,我会回答您问题的另一部分。

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.

如果您正在使用这些子程序的返回值,则需要更复杂的东西(简单地切换到哈希值会很有帮助),但是在您提供的代码示例中,您忽略了它们,这使事情变得容易。

关于perl - 在Perl中进行简单的并行处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3447638/

10-16 10:04