先描述一下场景:
我有一批任务需要放入线程池中去处理,但是一旦线程池中有1个任务出现了异常(抛了Exception)就将线程中尚未开始的任务全部取消不执行。
需要说明的是正在执行的任务因为无法撤销,所以正在执行的任务只能继续执行,等他执行完成。
import queue
from concurrent.futures import ThreadPoolExecutor, as_completed, wait, ALL_COMPLETED, FIRST_EXCEPTION
def send_cmd(ip, exec_queue):
# 如果消息队列中消息不为空,说明已经有任务异常了
if not exec_queue.empty():
return
try:
# 需要执行的主任务
except Exception as e:
# 如果任务异常了就在队列中写入一个消息,用于锁住线程池
exec_queue.put("Termination")
# 此处一定要将异常再次抛出,否则主线程池无法捕获异常,会统一认定为任务已被取消
raise Exception(e)
# 此处使用消息队列作为线程池锁,避免在第一个任务异常发生后到主线程获知中间仍然有任务被发送执行
exec_queue = queue.Queue()
with ThreadPoolExecutor(max_workers=thread_pool_size) as executor:
task_dict, task_list = {}, []
# 将任务全部放入线程池中
for ip in ip_list:
task = executor.submit(send_