在编写Python
脚本的时候,难免会遇到使用多线程操作的情况。
正常情况下,我们都习惯在Shell
中使用Ctrl+C
终止脚本的执行,但是在多线程环境中,我们发现Ctrl+C
并不能有效终止开启了多线程的脚本。
由于Python
提供的threading
模块并没有提供线程的退出接口,导致我们没有办法终止已经正常运行的线程,尤其是线程被阻塞在内核的情况下。
解决这个问题的办法就是在线程初始化之后设置为守护模式(setDaemon
),并且不要调用join
阻塞主线程。这样当主线程退出的时候,其他线程也随之退出了。
下面是我们解决这种问题的一个例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#!/bin/env python # -*- coding: utf-8 -*- import threading import signal import sys import time global is_exit is_exit = False def doWork(i): print "thread[%d] enter\n"%(i) while not is_exit: time.sleep(0.2) print "thread[%d] terminated\n"%(i) def sig_handler(signum, frame): is_exit = True sys.exit(0) if __name__ == "__main__": signal.signal(signal.SIGINT, sig_handler) signal.signal(signal.SIGTERM, sig_handler) cc = 5 for i in range(cc): t = threading.Thread(target=doWork, args=(i,)) t.setDaemon(True) t.start() raw_input("Waiting For Ctrl+C\n") |