2011-10-26 30 views
4

我想要創建一個線程,如果它在一段時間後沒有完成就會死掉。有沒有優雅和/或慣用的方式來做到這一點?現在我想做出一個觀察者線程:如何在一段時間後殺死一個紅寶石線程?

def myfunc 
    t = Thread.new{ 
    #do stuff 
    } 

    # watcher thread 
    Thread.new{ 
    result = t.join(20) # join returns nil if it timed out 
    t.kill if result.nil? 
    } 

    # continue on asynchronously from both threads 
end 

回答

6

也許Timeout類是你所需要的。

def myfunc 
    Thread.new{ 
    Timeout::timeout(20) { 
     #do stuff 
    } 
    } 

    # continue on asynchronously 
end 
+0

啊哈,太棒了!我編輯你的答案,包括如何使用它來解決問題的例子... –

+1

我認爲你不需要在一個線程中包裝Timeout對象。 Timeout爲代碼塊創建了一個線程,所以你不需要,除非你希望整個事物是異步的。 – Miguel

+0

是的,我希望它是異步的 - 這就是點,我想線程清理自己,如果它卡住了。 –

3

我相信在大多數情況下,你應該在線程的程序邏輯控制線程的「生命」。

假設線程實際上是一個無限循環,而不是一個普通的while(true),你可能有一個實例變量(例如is_running)並且使得循環類似while(is_running)。如果其他線程想要停止這個線程,他們可以簡單地(直接或間接)使is_running爲false。工作線程然後可以完成最後一項工作並完成循環。

+0

是的。但是在這種情況下,如果時間太長,我想完全殺死它。 –