2016-08-13 51 views
1

我正在創建一個perl應用程序,該應用程序在多個線程中執行並且每個線程都消耗時間。這是我迄今爲止Perl如何在繼續執行其他線程的情況下殺死perl中的'流氓'線程

use strict; 
use warnings; 
use threads; 

my @file_list = ("file1", "file2", "file3"); 
my @jobs; 
my @failed_jobs; 
my $timeout = 10; #10 seconds timeout 

foreach my $s (@file_list){ 
    push @jobs, threads->create(sub{ 
     #time consuming task 
    }) 
} 

$_->join for @jobs; 

的問題是耗時的工作時間有時可能會被卡住(或需要超過的時間$超時秒運行)。所以當發生這種情況時,我想獲取文件的名稱並將其推送到@failed_jobs,然後殺死該線程。但是,我想繼續與其他線程。當所有線程都被殺死或完成時,我想退出。

有人能告訴我如何修改我的上述代碼來實現這一目標嗎?

感謝

+0

如果你開始的所有線程在同一時間,那麼他們就會在同一時間所有的時間了,所以繼續等待一些,而其他人超時未實際發生的情況:) – hobbs

+0

您是否花時間閱讀[精細手冊](http://perldoc.perl.org/threads.html)?鑑於使用Perl的解釋器線程是不鼓勵的,你應該非常熟悉該頁面及其所有注意事項。線程信令部分對您的問題尤爲重要。由於我們不能也不應該複製優秀的現有文件,所以投票結束爲「太廣泛」。 –

+0

@Jim Garrison,本手冊對此問題保持沉默。你可以發送一個虛擬信號,但是如果這個進程被阻塞在XS庫中的正則表達式匹配中,這將無濟於事。 //只有在需要淺色線程的地方,Perl線程纔不鼓勵。該文本具有誤導性並需要補丁。這是假設要加強前一段,僅此而已。 – ikegami

回答

1

如果你想殺死任務的能力,你不希望的線程,但過程。