在perl脚本中为线程使用async
我需要做一些并行功能,但我必须为这些线程设置一个固定的时间限制(例如,最长5秒)。如果运行时间更长,我需要杀死所有正在运行的线程,但仍然保持程序活动。我的代码是:
use threads ( 'yield',
'exit' => 'threads_only',
'stack_size' => 2*16384 );
use threads::shared;
use Time::HiRes qw/sleep/;
...
$start = [Time::HiRes::gettimeofday()];
my $running :shared = 0;
foreach ($entry) {
async(
sub {
local $SIG{KILL} = sub { threads->exit };
{ lock $running; ++$running };
...
{ lock $running; --$running };
},
$_)->detach;
}
while ($running) {
sleep 0.005;
last if (Time::HiRes::tv_interval($start) > 5);
}
if ($running) {
my @running = threads->list(threads::running);
foreach (@running) {
$_->kill('KILL')->detach;
}
}
print "I am still aliven";
有没有更好的方法来杀死正在运行的线程并保持应用程序的活力?
不要那样做。对线程进行编码,使它们只做你想做的工作,并在没有工作可做时终止它们自己。不要试图从外部进入并杀死它们。这永远不会奏效。
async返回一个可以调用kill的线程对象。只需将它们推到数组中,然后再将它们杀死即可。
http://perldoc.perl.org/threads.html
一个更好的设计可能是让线程在这么长的时间后自杀。