2012-07-11 6 views
33

私がここでやろうとしているのは、キーボード割り込みを使用してプログラム内の進行中のすべてのスレッドを終了することです。キーボード割り込みですべてのスレッドを閉じる

for i in taskDictionary: 
    try: 
     sleep(60) 
     thread = Thread(target = mainModule.executeThread) 
     thread.start() 
    except KeyboardInterrupt: 
     thread.__stop() 

プログラム自体がスレッドに影響を与え、さらにはシーケンシャルに起動するオプションを有する異なる変数のトンを占め、はるかに複雑である:これは、スレッドが作成された私のコードの下に切り詰めバージョンですモードでは、タスクはスレッド化されず、代わりに1つずつ起動されるため、ちょうど私が思いついたこの小さなバリエーションにいくつかの問題があるかもしれません。 私は50/50の結果を生み出す方法でこれを行っています。割り込みは機能しますが、スレッドは決してきれいに終了しません。時々彼らは行くつもりですが、将来のスレッドの実行を中断します。何回か、割り込みに関する大規模なエラーで終了し、割り込みがまったく何もしない場合もあります。前回実行したプログラムでは、将来のスレッドの実行を停止しましたが、現在のスレッドは停止しませんでした。 スレッドが実際に実行されているモジュールに入ることなくスレッドを終了する方法はありますか?

答えて

52

同様の質問は「どのようにスレッドを殺すのですか?

スレッディングモジュールのロックオブジェクトまたはイベントオブジェクトによって制御されるスレッドに、終了ハンドラを作成します。次に、単にロックを解除するか、イベントオブジェクトに信号を送ります。これにより、処理を停止して正常に終了すべきスレッドに通知されます。あなたのメインプログラムのスレッドを通知した後、残る唯一のことはmainthread.join()メソッドを使用してスレッドがシャットダウンするのを待つことです。

短い例:あなたは本当にスレッドを殺すの機能が必要な場合は

import threading 
import time 

def timed_output(name, delay, run_event): 
    while run_event.is_set(): 
     time.sleep(delay) 
     print name,": New Message!" 


def main(): 
    run_event = threading.Event() 
    run_event.set() 
    d1 = 1 
    t1 = threading.Thread(target = timed_output, args = ("bob",d1,run_event)) 

    d2 = 2 
    t2 = threading.Thread(target = timed_output, args = ("paul",d2,run_event)) 

    t1.start() 
    time.sleep(.5) 
    t2.start() 

    try: 
     while 1: 
      time.sleep(.1) 
    except KeyboardInterrupt: 
     print "attempting to close threads. Max wait =",max(d1,d2) 
     run_event.clear() 
     t1.join() 
     t2.join() 
     print "threads successfully closed" 

if __name__ == '__main__': 
    main() 

、マルチプロセッシングを使用します。 SIGTERMを個々の「プロセス」に送ることができます(スレッド化モジュールにも非常に似ています)。一般的に言えば、スレッディングはIOバインド時、マルチプロセッシングは本当にプロセッサバインド時です。

+7

スレッドの協力を得て、任意の方法で削除することができます。スレッドの協力がなければ、安全な方法はなく、すべての道路が痛みを引き起こします。 –

+1

華麗な答え!正確には私が探していたものではありませんでしたが、私が必要としていたものにロジックを適応させるのに十分な広さでした!ありがとう! – Joe

+1

私はスレッドを使用しています。なぜなら、Trueループの間は無限にしたくないからです。これはあなたのCPUの時間をすべて無駄にします。私はこのようなことをやったことがあり、睡眠を取らないと、一度に**秒**の間CPU%を100%まで上昇させ、小さな睡眠でこれはほんの少しだけ助けになります。これを行う方法はありますか? – dylnmc

関連する問題