2

各スレッドを無限ループで実行する架空のスレッド Python アプリケーションを考えてみましょう。

import signal                                                          
import sys 
import threading
import time

class CallSomebody (threading.Thread):
        def __init__(self, target, *args):
                self._target = target
                self._args = args
                threading.Thread.__init__(self)

        def run (self):
                self._target(*self._args)

def call (who):
        while True:
                print "Who you gonna call? %s" % (str(who))



def signal_handler(signal, frame):
    sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)



a=CallSomebody(call, 'Ghostbusters!')
a.daemon=True

b=CallSomebody(call, 'The Exorcist!')
b.daemon=True

a.start()
b.start()

a.join()
b.join()

アプリケーションの実行中に、 を押して SIGINT を送信してCtrlCも、アプリケーションは停止しません。ステートメントを削除しようとしましたdaemonが、役に立ちませんでした。私が見逃している基本的なアイデアは何ですか?

ありがとう。

4

1 に答える 1

4

スレッドを実行joinすると、結合されたスレッドが戻るまでアクティブなスレッドがブロックされます。あなたのものは決してしません。この方法でそれらに参加したくないでしょう。

一般に、デーモン スレッドであり、無限ループを実行するバックグラウンド スレッドは、デーモンとしてマークし、決して結合せず、メイン スレッドが結合したときに期限切れになるようにする必要があります。たとえば、たまたま使用していた場合、デーモンスレッドを開始した後wxに呼び出しを行いAppInstance.MainLoop()、フレームまたはその他の最上位インスタンスが閉じられると、プログラムの実行が終了し、デーモンが処理されます適切に。

于 2012-11-26T00:14:53.657 に答える