先描述一下场景:

我有一批任务需要放入线程池中去处理,但是一旦线程池中有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_cmd, ip, exec_queue)
task_dict[task] = ip
task_list.append(task)
# 等待第一个任务抛出异常,就阻塞线程池
wait(task_list, return_when=FIRST_EXCEPTION)
# 反向序列化之前塞入的任务队列,并逐个取消
for task in reversed(task_list):
task.cancel()
# 等待正在执行任务执行完成
wait(task_list, return_when=ALL_COMPLETED) for task in task_list:
if task_dict.get(task):
if "finished returned NoneType" in str(task) or task.cancelled():
print("{}被取消".format(task_dict.get(task)))
elif "finished raised Exception" in str(task):
print("{}执行异常".format(task_dict.get(task)))
else:
print("{}执行成功".format(task_dict.get(task)))

加入队列作为线程池锁,是因为在实际测试中发现,如果所有任务被一次性塞入线程池后,当第一个异常发生到,异常被主线程池捕获中间,仍然会有任务被执行,具体数量依据任务执行的快慢,数量也是不定的,但至少会有1个,属于必现情况。加入线程池,可以有效阻止这类问题的发生。

python利用ThreadPoolExecutor实现有任务异常,就终止线程池中的所有剩余任务的更多相关文章

  1. Java线程池ThreadPoolExecutor使用和分析(三) - 终止线程池原理

    相关文章目录: Java线程池ThreadPoolExecutor使用和分析(一) Java线程池ThreadPoolExecutor使用和分析(二) - execute()原理 Java线程池Thr ...

  2. ThreadPoolExecutor之二:jdk实现的线程池介绍

    一 简介 线程的使用在java中占有极其重要的地位,在jdk1.4极其之前的jdk版本中,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观.Jdk1.5之后加入了java.uti ...

  3. c#线程池中的异常

    static void Main(string[] args) { //写日志 //使用线程池 ; i < ; i++) { ThreadPool.QueueUserWorkItem(new W ...

  4. ThreadPoolExecutor线程池中线程不能超过核心线程数量的问题

    int arg1=2;//核心线程 int arg2=40;//最大线程数量 int arg3=100;//空余保留时间 ThreadPoolExecutor pool=new ThreadPoolE ...

  5. 线程池中状态与线程数的设计分析(ThreadPoolExecutor中ctl变量)

    目录 预备知识 源码分析 submit()源码分析 shutdownNow()源码分析 代码输出 设计目的与优点 预备知识 可以先看下我的另一篇文章对于Java中的位掩码BitMask的解释. 1.一 ...

  6. 【高并发】通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程

    核心逻辑概述 ThreadPoolExecutor是Java线程池中最核心的类之一,它能够保证线程池按照正常的业务逻辑执行任务,并通过原子方式更新线程池每个阶段的状态. ThreadPoolExecu ...

  7. Python之路第十一天,高级(3)-线程池

    线程池 简单的线程池的实现: import queue import threading import time class ThreadPool(object): def __init__(self ...

  8. Java8线程池ThreadPoolExecutor底层原理及其源码解析

    小侃一下 日常开发中, 或许不会直接new线程或线程池, 但这些线程相关的基础或思想是非常重要的, 参考林迪效应; 就算没有直接用到, 可能间接也用到了类似的思想或原理, 例如tomcat, jett ...

  9. 从源码角度来分析线程池-ThreadPoolExecutor实现原理

    作为一名Java开发工程师,想必性能问题是不可避免的.通常,在遇到性能瓶颈时第一时间肯定会想到利用缓存来解决问题,然而缓存虽好用,但也并非万能,某些场景依然无法覆盖.比如:需要实时.多次调用第三方AP ...

随机推荐

  1. 怎么把使用vuepress搭建的博客部署到Github Pages

    推荐在这里阅读效果更佳 背景 网上搜了很多教程,包括官网的教程,但是还是费了一番功夫, 如果你使用自动化部署脚本部署不成功的话,可以参考我的这个笨方法 这是部署后的效果 前提 我假设你本地运行OK, ...

  2. 基于Proxy的小程序状态管理

    摘要: 小程序状态管理. 作者:wwayne 原文:基于Proxy的小程序状态管理 Fundebug经授权转载,版权归原作者所有. 微信小程序的市场在进一步的扩大,而背后的技术社区仍在摸索着最好的实践 ...

  3. youtube视频在线下载

    youtube视频在线下载网站: https://www.clipconverter.cc/ youtube视频样例: https://www.youtube.com/watch?v=NMkgz0AR ...

  4. linux 互斥锁和条件变量

    为什么有条件变量? 请参看一个线程等待某种事件发生 注意:本文是linux c版本的条件变量和互斥锁(mutex),不是C++的. mutex : mutual exclusion(相互排斥) 1,互 ...

  5. uwsgi + nginx 发布

    下载uwsgi 基于pip 若是没有下载 yum install -y python2-pip pip install uwsgi 出上面的错 ,安装python的development包 yum i ...

  6. flask 上下文

    上文:找到被创建成字典形式的东西 下文: 找到request并执行

  7. google v8

    https://github.com/tongbai168/v8 https://iwebing.lofter.com/tag/chromium  编译动态库 gyp mylib.gyp --dept ...

  8. 201871010125 王玉江 《面向对象程序设计(java)》 第四周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/wswyj/ 作业学习目 ...

  9. LeetCode 113. Path Sum II路径总和 II (C++)

    题目: Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the give ...

  10. JDOJ 2255 A+B Problem

    JDOJ 2255: A+B Problem https://neooj.com/oldoj/problem.php?id=2255 Description Solve A+B problem wit ...