2011-06-29 20 views
40

一定の時間が経過してスレッドを終了させようとしています。これらのスレッドは無限ループ中に実行され、この間に無作為に長い時間ストールすることがあります。スレッドは、duration変数で設定された時間より長く持続することはできません。 長さによって設定された長さの後にスレッドを停止させるにはどうすればよいでしょうか。一定時間後にスレッドを停止する

def main(): 
    t1 = threading.Thread(target=thread1, args=1) 
    t2 = threading.Thread(target=thread2, args=2) 

    time.sleep(duration) 
    #the threads must be terminated after this sleep 
+2

最後にあなたがこのスレッドを終了させることをお勧めします。どうしてそんなことはできないの? http://stackoverflow.com/questions/6523526/python-multi-threading-help – Nix

+0

あなたのスレッドはブロックされますか? – Nix

+0

スレッドは無限ループで実行されます。スレッドがランダムな時間スリープする可能性があります。スレッドは、プログラムの開始時に指定された期間にわたって絶対に実行することはできません。スレッドがどれくらいの時間スリープしていないのであれば、どのように終了するかを知っていますか? – Takkun

答えて

96

これは、あなたがブロックしていない場合に動作します。

あなたが眠っていることを計画している場合は、睡眠のためにイベントを使用することが絶対に不可欠です。そのイベントを睡眠に利用すると、誰かが "眠っている"ときに止めるように指示すると、目を覚ますでしょう。 time.sleep()を使用すると、のスレッドはの後に停止します。

def main(): 
    t1_stop= threading.Event() 
    t1 = threading.Thread(target=thread1, args=(1, t1_stop)) 

    t2_stop = threading.Event() 
    t2 = threading.Thread(target=thread2, args=(2, t2_stop)) 

    time.sleep(duration) 
    #stop the thread2 
    t2_stop.set() 

def thread1(arg1, stop_event): 
    while(not stop_event.is_set()): 
     #similar to time.sleep() 
     stop_event.wait(time) 
     pass 


def thread2(arg1, stop_event): 
    while(not stop_event.is_set()): 
     stop_event.wait(time) 
     pass 
+0

パスは必要ありませんか? – MaxNoe

+0

'stop_event.wait(time)'の 'time'は' 1'のような数値変数か、 'import'の' time'モジュールですか?私はちょうどチェックしているので、それのようなモジュールを使用することは奇妙に思えます。 – mdw7326

+2

Googleでこれを見つけ、同じ質問があったので、私は貢献することに決めました。それは数分の1秒です。だから 'stop_event.wait(1)'は1秒です。 –

9

あなたは(あなたの例で暗示される)スレッドがとき、あなたのプログラムが終了停止したい場合は、それらdaemon threadsします。

スレッドでコマンドを実行したい場合は、手作業で行う必要があります。さまざまな方法がありますが、スレッドのループをチェックして終了するかどうかを確認する必要があります(Nixの例を参照)。

関連する問題