Perl线程杀死超时线程

时间:2015-08-07 12:56:02

标签: perl

我有一个使用threads的多线程perl脚本,工作正常但是当它试图杀死被绞死的线程时我收到错误并且脚本存在:

for (0..$threads-1) {
        $trl[$_] = threads->create(\&my_sub, $_);
        $SIG{ALRM} = sub {
                if ($trl->is_running) {
                   $trl->kill('ALRM');
                }
        }
}
for (@trl) {
        alarm 10;
        $_->join;
}

sub my_sub {
  $SIG{ALRM} = sub {
        threads->exit(1);
  };
  while (@site) {
  {
        lock(@site);
        $url = shift @site;
  }

和错误:

Can't call method "is_running" on an undefined value at test.pl line 61.
Perl exited with active threads:
        9 running and unjoined
        40 finished and unjoined
        0 running and detached

第61行是:

if ($trl->is_running) {

1 个答案:

答案 0 :(得分:4)

好的,请开启strictwarnings。这会告诉您@trl$trl不是一回事。具体来说 - 你的程序中的'信号处理程序' - 你每次启动一个线程时都会重新定义,所以它只会杀掉最新的一个。 (除非它不会,因为$tr1未定义)。

我建议你不要混淆信号和线程 - 这更多地取决于你在做什么。但通常我会建议 - forkkillthreadThread::SemaphoreThread::Queue