带线程的Python程序can';t捕捉CTRL+;C
我正在编写一个python脚本,它需要运行一个线程来侦听网络套接字 我无法使用下面的代码使用Ctrl+c杀死它:带线程的Python程序can';t捕捉CTRL+;C,python,multithreading,Python,Multithreading,我正在编写一个python脚本,它需要运行一个线程来侦听网络套接字 我无法使用下面的代码使用Ctrl+c杀死它: #!/usr/bin/python import signal, sys, threading THREADS = [] def handler(signal, frame): global THREADS print "Ctrl-C.... Exiting" for t in THREADS: t.alive = False s
#!/usr/bin/python
import signal, sys, threading
THREADS = []
def handler(signal, frame):
global THREADS
print "Ctrl-C.... Exiting"
for t in THREADS:
t.alive = False
sys.exit(0)
class thread(threading.Thread):
def __init__(self):
self.alive = True
threading.Thread.__init__(self)
def run(self):
while self.alive:
# do something
pass
def main():
global THREADS
t = thread()
t.start()
THREADS.append(t)
if __name__ == '__main__':
signal.signal(signal.SIGINT, handler)
main()
对于如何捕获Ctrl+c并终止脚本的建议,我们深表感谢。这是因为信号只能由主线程捕获。在这里,主线程很久以前就结束了他的生命(应用程序正在等待线程完成)。尝试添加
while True:
sleep(1)
到main()
的末尾(当然还有从最顶端导入睡眠的)
或者正如凯文所说:
for t in THREADS:
t.join(1) # join with timeout. Without timeout signal cannot be caught.
问题是,在执行从主线程脱落后(返回main()
后,threading
模块将暂停,使用锁等待其他线程完成;锁不能被信号中断。至少在Python2.x中是这样
一个简单的修复方法是通过添加一个无限循环来避免从主线程脱落,该循环调用一些函数,这些函数在某些操作可用之前一直处于休眠状态,如select.select()
。如果根本不需要主线程执行任何操作,请使用signal.pause()
。例如:
if __name__ == '__main__':
signal.signal(signal.SIGINT, handler)
main()
while True: # added
signal.pause() # added
使用Thread.join()
比使用带超时的旋转循环更可取。@KevinStone-您尝试过吗?将我的旋转循环替换为线程中t的超时:t.join()
。有趣。我一个线程都不知道。join耗尽了信号处理程序。具有讽刺意味的是,您可以为连接设置一个超时,信号将被处理。下面是一个连接和长超时的示例:主线程没有关闭,它正在等待线程连接并返回主线程