我正在编写一个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
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 并终止脚本的任何建议。
答案 0 :(得分:9)
问题是,执行从主线程中掉落(在main()
返回之后),threading
模块将暂停,等待其他线程完成,使用锁;和锁不能被信号中断。至少在Python 2.x就是这种情况。
一个简单的解决方法是避免从主线程中掉落,方法是添加一个无限循环来调用某个函数,该函数在某些操作可用之前就会休眠,例如select.select()
。如果您根本不需要主线程来执行任何操作,请使用signal.pause()
。例如:
if __name__ == '__main__':
signal.signal(signal.SIGINT, handler)
main()
while True: # added
signal.pause() # added
答案 1 :(得分:4)
这是因为信号只能被主线程捕获。这里主线程终于结束了他的生命(应用程序正在等待你的线程完成)。尝试添加
while True:
sleep(1)
到main()
的末尾(当然还有from time import sleep
在最顶层)。
或凯文说:
for t in THREADS:
t.join(1) # join with timeout. Without timeout signal cannot be caught.