在 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 alive\n";
有没有更好的方法如何杀死正在运行的线程并保持应用程序活着?
答案 0 :(得分:5)
不要这样做。对线程进行编码,使它们只能完成你想要完成的工作,并在没有工作要做的时候自行终止。不要试图从外面进去杀死他们。这从来都不行。
答案 1 :(得分:1)