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()

运行应用程序时,通过按下发送 SIGINTCtrlC不会停止应用程序。我尝试删除这些daemon陈述,但这没有帮助。我缺少什么基本思想?

谢谢。

4

1 回答 1

4

当你join一个线程时,活动线程会阻塞,直到加入的线程返回。你的从来没有。你不会想以这种方式加入他们。

通常,作为守护线程并执行无限循环的后台线程应标记为守护线程,从不加入,然后在主线程这样做时允许过期。wx例如,如果您碰巧正在使用,您会AppInstance.MainLoop()在启动守护线程后调用 to,然后当您的 Frame 或您拥有的任何其他顶级实例关闭时,程序执行将结束,并且守护进程将被处理适当地。

于 2012-11-26T00:14:53.657 回答