杀死一个无限循环的线程应用程序

时间:2012-11-25 23:46:21

标签: python signals

考虑一个假设的线程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()

运行应用程序时,按 Ctrl C 发送SIGINT不会停止应用程序。我尝试删除daemon语句,但这没有帮助。我错过了什么基本想法?

感谢。

1 个答案:

答案 0 :(得分:4)

当你join一个线程时,活动线程会阻塞,直到联接的线程返回。你永远做不到。你不会想以这种方式加入他们。

通常,作为守护程序线程并执行无限循环的后台线程应标记为守护程序,从不加入,然后在主线程执行此操作时允许过期。例如,如果您恰好使用wx,则在启动守护程序线程后调用AppInstance.MainLoop(),然后当您的Frame或其他任何顶级实例关闭时,程序执行将得出结论,守护进程将得到适当的解决。