2011-10-26 5 views
4

一定の時間が経過しても終了しないと、私が作成したスレッドが死ぬことを望みます。これを行うためのエレガントなやり方や慣用的な方法はありますか?今、私はウォッチャースレッドを作るために考えています:一定の時間が経過したら、どのようにしてrubyスレッドを削除できますか?

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

真。しかし、この場合、時間がかかりすぎると絶対に殺したいと思っています。 –

関連する問題