我在某个对象的函数内有一些代码块,它们可以并行运行并加快速度。
我尝试使用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
之前,但考虑到它正在为您完成所有线程处理,而且它似乎正在这样做wrong,根据错误信息,我认为有点可疑。
通常我不会建议就这样扔掉它,但你所做的确实没有任何意义harder使用普通线程接口,那么为什么不尝试一下,并稍微简化问题呢?同时,我将回答你问题的另一部分。
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.
如果您使用这些子函数的返回值(只需切换到哈希值就会有很大帮助),那么您需要一些更复杂的东西,但在您提供的代码示例中,您忽略它们,这使事情变得简单。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)