2012-11-25 138 views
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() 

运行应用程序时,按Ctrl键Ç不会停止发送SIGINT应用程序。我试图删除daemon声明,但这并没有帮助。我错过了什么基本的想法?

谢谢。

回答

4

当您在线程中活动线程阻塞时,直到连接线程返回。你永远不会做。你不会希望以这种方式加入他们。

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

+0

谢谢。我现在不使用'wx'或任何其他图形软件包,只是学习。 – dotancohen

+0

@dotancohen - 不用担心,不用客气。您可以引入一个简单的'time.sleep(5)'来表明几秒钟后台线程运行,然后让正常的程序执行完成。 –