Python 终止无限循环线程应用程序

Python 终止无限循环线程应用程序,python,signals,Python,Signals,假设一个线程Python应用程序在无限循环中运行每个线程: import signal import sys import threading import time class CallSomebody (threading.Thread): def __init__(self, target, *args): self._ta

假设一个线程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()
运行应用程序时,按CtrlC发送SIGINT不会停止应用程序。我尝试删除守护进程语句,但没有帮助。我遗漏了什么基本理念

谢谢。

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

通常,作为守护进程线程并执行无限循环的后台线程应该标记为守护进程,从不加入,然后允许在主线程加入时过期。例如,如果您碰巧使用wx,则在启动守护线程后调用AppInstance.MainLoop,然后当框架或任何其他顶级实例关闭时,程序执行将结束,并且守护进程将被适当地寻址。

当您加入线程时,活动线程将阻塞,直到加入的线程返回。你的永远不会。你不会想以这种方式加入他们的


通常,作为守护进程线程并执行无限循环的后台线程应该标记为守护进程,从不加入,然后允许在主线程加入时过期。例如,如果您碰巧使用了wx,则在启动守护线程后调用AppInstance.MainLoop,然后当框架或任何其他顶级实例关闭时,程序执行将结束,守护进程将得到适当的处理。

谢谢。我现在没有使用wx或任何其他图形软件包,只是在学习。@dotancohen-不用担心,欢迎您。您可以加入一个简单的time.sleep5来显示后台线程运行了几秒钟,然后让正常的程序执行完成。谢谢。我现在没有使用wx或任何其他图形软件包,只是在学习。@dotancohen-不用担心,欢迎您。您可以加入一个简单的time.sleep5来显示后台线程运行了几秒钟,然后让正常的程序执行完成。