在编写Python
脚本的时候,难免会遇到使用多线程操作的情况。
正常情况下,我们都习惯在Shell
中使用Ctrl+C
终止脚本的执行,但是在多线程环境中,我们发现Ctrl+C
并不能有效终止开启了多线程的脚本。
由于Python
提供的threading
模块并没有提供线程的退出接口,导致我们没有办法终止已经正常运行的线程,尤其是线程被阻塞在内核的情况下。
解决这个问题的办法就是在线程初始化之后设置为守护模式(setDaemon
),并且不要调用join
阻塞主线程。这样当主线程退出的时候,其他线程也随之退出了。
下面是我们解决这种问题的一个例子:
#!/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")
参考链接
Python 中用 Ctrl+C 终止多线程程序的问题解决