Dav*_*d B 5 parallel-processing perl
我有一些代码块,在一些对象的函数内,可以并行运行并为我加速.
我尝试使用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
}
Run Code Online (Sandbox Code Playgroud)
首先,注意我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
Run Code Online (Sandbox Code Playgroud)
hob*_*bbs 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.
Run Code Online (Sandbox Code Playgroud)
如果你使用那些sub的返回值,你需要一些更复杂的东西(简单地切换到一个散列会有很大帮助)但是在你提供的代码示例中,你忽略了它们,这使事情变得容易.
归档时间: |
|
查看次数: |
6249 次 |
最近记录: |