2012-06-18 15 views
12

私は(threading.Timerクラスを使用して)次のコードでは、次の行動に気づいた:パイソン - threading.Timerキャンセル呼び出した後に生きたまま()メソッド

import threading 

def ontimer(): 
    print threading.current_thread() 

def main(): 
    timer = threading.Timer(2, ontimer) 
    timer.start() 
    print threading.current_thread() 
    timer.cancel() 
    if timer.isAlive(): 
     print "Timer is still alive" 
    if timer.finished: 
     print "Timer is finished" 


if __name__ == "__main__": 
main() 

コードの出力は次のとおりです。

<_MainThread(MainThread, started 5836)> 
Timer is still alive 
Timer is finished 

出力からわかるように、タイマーオブジェクトはまだ生存しており、同時に終了しています。

実際、何百回も同様の機能を呼びたいと思います。これらの「リビング」タイマーがパフォーマンスに影響するかどうかは疑問です。

タイマーオブジェクトを適切に停止またはキャンセルしたいと考えています。私はそれを正しくしていますか?

答えて

11

A TimerThreadのサブクラスであり、そのimplementationは本当に簡単です、ありがとうございました。 finishedというイベントに登録することにより、提供された時間を待ちます。

イベントをTimer.cancelに設定すると、関数が呼び出されないことが保証されます。しかし、Timerスレッドが直接続行(および終了)することは保証されていません。

したがって、cancelの実行後もタイマーのスレッドがまだ生存している可能性がありますが、その機能は実行されません。したがってfinishedのチェックは安全ですが、Thread.is_alive(新しいAPI、これを使用してください!)のテストはこの場合の競合状態です。

ヒント:cancelを呼び出した後にtime.sleepと入力して確認できます。そして、それだけで印刷されます:

<_MainThread(MainThread, started 10872)> 
Timer is finished 
10

あなたのタイマーのスレッドが実際に終了して洗浄されるまで待機するthread.join()を使用する必要があります。

import threading 

def ontimer(): 
    print threading.current_thread() 

def main(): 
    timer = threading.Timer(2, ontimer) 
    timer.start() 
    print threading.current_thread() 
    timer.cancel() 
    timer.join()   # here you block the main thread until the timer is completely stopped 
    if timer.isAlive(): 
     print "Timer is still alive" 
    else: 
     print "Timer is no more alive" 
    if timer.finished: 
     print "Timer is finished" 


if __name__ == "__main__": 
main() 

この意志表示:

<_MainThread(MainThread, started 5836)> 
Timer is no more alive 
Timer is finished 
+0

は精緻をありがとうございました。 –

関連する問題