Python3让线程在引发keyboardexception时完成

时间:2017-02-07 04:57:36

标签: python multithreading exception keyboardinterrupt

我正在寻找一种让线程完成工作的方法,如果提出CTRL-C,就不会重新开始工作。 理论代码:

import threading
from Queue import Queue
q = Queue(maxsize=0)
def work(q):
    print (line)
for line in file_of_100_line:
    q.put(line)
nbThreads = 2
for i in range(nbThreads):
    t = threading.Thread(target=work, args=(q))
    t.setDaemon(True)
    t.start()

如果引发键盘异常(CTRL-C),让工作人员打印该行,当所有工作人员完成当前任务时,退出。

1 个答案:

答案 0 :(得分:1)

以下应该做你想做的事:

import signal
import threading
from time import sleep

keep_running = True

def signal_handler(signal, frame):
    global keep_running
    keep_running = False
    print("Received SIGINT\n")

signal.signal(signal.SIGINT,signal_handler)

def work():
    while keep_running:
        sleep(2)
    print("Worker finished\n")

nbThreads = 2
threads = []
for i in range(nbThreads):
    t = threading.Thread(target=work)
    t.setDaemon(True)
    t.start()
    threads.append(t)

while any([t.isAlive() for t in threads]):
    sleep(0.1)

让这个程序运行产生

Received SIGINT

Worker finished
Worker finished

说明:当按下CTRL-C时,程序会收到signal.SIGINT,这会导致注册的处理程序signal_handler被调用,将全局变量keep_running设置为False。同时主线程等待所有生成的线程死亡。因此,在主线程终止之前,这些线程可以完成它们正在做的任何事情(在这种情况下为sleep - ing)。

注意:在Linux上等待信号可以通过调用signal.pause()(替换sleep(0.1))来实现。在Windows上,这是不可能的,因为此功能不存在。因此,上述内容应该不依赖于平台。