Python3 在引发键盘异常时让线程完成
Python3 Let threads finish when keyboardexception raised
我正在寻找一种方法,让线程完成它们的工作,并且在触发 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 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
设置为 [=15] =].同时,主线程等待所有派生的线程死亡。因此,这些线程可以在主线程终止之前完成它们正在做的任何事情(在本例中 sleep
-ing)。
注意:在 Linux 上等待信号可以通过调用 signal.pause()
(替换 sleep(0.1)
)来实现。在 Windows 这是不可能的,因为这个函数不存在。因此上面应该少platform-dependant.
我正在寻找一种方法,让线程完成它们的工作,并且在触发 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 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
设置为 [=15] =].同时,主线程等待所有派生的线程死亡。因此,这些线程可以在主线程终止之前完成它们正在做的任何事情(在本例中 sleep
-ing)。
注意:在 Linux 上等待信号可以通过调用 signal.pause()
(替换 sleep(0.1)
)来实现。在 Windows 这是不可能的,因为这个函数不存在。因此上面应该少platform-dependant.