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();
}
我們也不知道'processFile'中發生了什麼。可能是線程異常終止,從而不能釋放信號量。 。 – Sobrique
另外:爲什麼'dequeue_nb'?當你完成處理時,爲什麼不只是''出隊'和'結束'隊列。另外 - '新(子{開始()}) - 爲什麼你需要一個匿名子調用另一個子。線程 - >創建(\&開始)'由於某種原因不夠實際? – Sobrique
真的不知道你爲什麼在這裏使用信號量。我的意思是,等待「加入」操作有什麼問題? – Sobrique