如何杀死正在运行的线程并保持perl应用程序活着?

时间:2012-03-02 01:14:00

标签: multithreading perl

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";

有没有更好的方法如何杀死正在运行的线程并保持应用程序活着?

2 个答案:

答案 0 :(得分:5)

不要这样做。对线程进行编码,使它们只能完成你想要完成的工作,并在没有工作要做的时候自行终止。不要试图从外面进去杀死他们。这从来都不行。

答案 1 :(得分:1)

async返回一个可以调用kill的线程对象。只需将它们推到阵列上然后杀死它们。

http://perldoc.perl.org/threads.html

更好的设计可能是让线程在这段时间后自杀。