长时间运行后,Perl线程突然停止工作

时间:2016-11-30 11:49:06

标签: multithreading perl

我有一个perl脚本,它通过不同线程中的文件和进程文件队列:

填写文件队列后,下面是一个片段。 问题是,有时当我让它运行太久(12-24小时)时,我会回来看剧本。

我有每个线程的日志文件,我看到活动的最后一个时间戳对于所有这些都是相同的。但是脚本没有退出,这意味着线程不会返回信号量。 此外,我确信线程没有正确结束,因为我仍然可以看到队列中充满了要处理的文件。

我在调用EXE之前和之后都有一个日志,最后一个跟踪始终是调用EXE后的跟踪。无法找到合理的解释。

#initiate all threads
for( my $i = 0; $i < $max_thread; $i++ )
{
   my $my_thread = threads->new( sub { start() } );
   push( @Threads, $my_thread );
}

$semaphore->down($max_thread);

terminate();    
sub start
{
   $SIG{INT} = sub { thread_exit() };

   while( (my $file = $file_queue->dequeue_nb) )
   {
      #This function calls an external EXE
      processFile( $file );
   }

    #Thread ended
    $semaphore->up();

}

1 个答案:

答案 0 :(得分:0)

如果你的线程中抛出了未捕获的异常,那么信号量永远不会被“upped”。看起来您正在使用信号量等待线程退出,这可以使用$thread->join更安全地完成。

假设你对退出的主题是正确的。它也可能是线程停滞(例如死锁)或进入无限循环。