Python3 让线程在引发键盘异常时完成



我正在寻找一种方法,让线程完成它们的工作,并且在引发 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(,则让工作人员打印该行,当所有工作人员完成其当前任务时,退出。

以下内容应该可以满足您的需求:

import signal
import threading
from time import sleep
keep_running = True
def signal_handler(signal, frame):
    global keep_running
    keep_running = False
    print("Received SIGINTn")
signal.signal(signal.SIGINT,signal_handler)
def work():
    while keep_running:
        sleep(2)
    print("Worker finishedn")
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 上,这是不可能的,因为此功能不存在。因此,上述内容应该较少依赖于平台。

相关内容

  • 没有找到相关文章

最新更新