如何杀死正在运行的线程并保持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 aliven";

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

不要那样做。对线程进行编码,使它们只做你想做的工作,并在没有工作可做时终止它们自己。不要试图从外部进入并杀死它们。这永远不会奏效。

async返回一个可以调用kill的线程对象。只需将它们推到数组中,然后再将它们杀死即可。

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

一个更好的设计可能是让线程在这么长的时间后自杀。

最新更新