2016-11-30 52 views
0

我有一個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(); 

} 
+0

我們也不知道'processFile'中發生了什麼。可能是線程異常終止,從而不能釋放信號量。 。 – Sobrique

+0

另外:爲什麼'dequeue_nb'?當你完成處理時,爲什麼不只是''出隊'和'結束'隊列。另外 - '新(子{開始()}) - 爲什麼你需要一個匿名子調用另一個子。線程 - >創建(\&開始)'由於某種原因不夠實際? – Sobrique

+0

真的不知道你爲什麼在這裏使用信號量。我的意思是,等待「加入」操作有什麼問題? – Sobrique

回答

0

如果在你的線程中拋出一個未捕獲的異常,信號量將永遠不會被「上傳」。看起來您正在使用信號燈等待線程退出,這可以使用$thread->join更安全地完成。

這是假設你已經退出的線程是正確的。也可能是線程停滯(例如死鎖)或進入無限循環。