lol*_*toy 9 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
    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并终止脚本的任何建议.
Arm*_*igo 10
问题是,在执行从主线程脱落后(main()返回后),threading模块将暂停,等待其他线程完成,使用锁; 和锁不能被信号中断.至少在Python 2.x中就是这种情况.
一个简单的解决方法是避免从主线程中掉落,通过添加一个无限循环来调用某个函数,该函数在某些操作可用之前就会休眠,例如select.select().如果您根本不需要主线程来执行任何操作,请使用signal.pause().例:
if __name__ == '__main__':
    signal.signal(signal.SIGINT, handler)
    main()
    while True:           # added
        signal.pause()    # added
这是因为信号只能被主线程捕获。在这里主线程很久以前就结束了他的生命(应用程序正在等待您的线程完成)。尝试添加
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.