Python中用Ctrl+C终止threading初始化的多线程脚本

在编写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 终止多线程程序的问题解决

发布者

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注