concurrent.futures 模块提供异步执行可调用对象高层接口

而异步执行可以由 ThreadPoolExecutor 线程或由 ProcessPoolExecutor 使用单独的进程来实现。 两者都是实现抽像类 Executor 定义的接口。

一、ThreadPoolExecutor 线程池

  1. 线程池执行器:ThreadPoolExecutor类

    1. 快速导入:from concurrent.futures import ThreadPoolExecutor
  2. 如何使用:

    1. 创建一个线程池对象:ThreadPoolExecutor(max_workers=5)
      参数:max_workers 表示最大可同时执行的线程数
    1. submit(任务函数)方法: 去提交任务执行
    1. shutdown()方法: 等待线程尺池中所有的任务执行完毕之后,在往下执行
    1. map(任务函数,参数)方法: 用于批量任务提交,前面参数是:任务函数 后面是任务函数参数
  3. 线程池的优点:

    1.使用线程池可以避免频繁的去创建线程,销毁线程,可以减少内存的使用

  4. ThreadPoolExecutor类基本语法使用:

    # 创建一个队列对象
    q = Queue()# 生产数据
    def work():for i in range(5):  for a in range(20):  print(f"这是第{i}轮数据插入,插入的数据为:{a}")q.put(a)time.sleep(1)     # 创建一个线程池对象
    # 参数:max_workers   表示最大可同时执行的线程数
    tpool = ThreadPoolExecutor(max_workers=5)# 1.submit(函数)方法:去提交任务
    tpool.submit(work)# 2.shutdown()方法:等待线程尺池中所有的任务执行完毕之后,在往下执行
    tpool.shutdown()print("---------------------- 结束执行 -----------------------")
    
  5. ThreadPoolExecutor类上下文管理协议的语法使用:

    1. 上下文管理协议的语法:

      with ThreadPoolExecutor(max_workers=5) as tpool:tpool.submit(提交的任务函数)
      
    2. 使用上下文管理器后,无需使用shutdown()方法,在使用 with 语句时,会调用时将 wait 设为 True ,会一样等待

      q = Queue()# 生产数据
      def work():for i in range(5): for a in range(20): print(f"这是第{i}轮数据插入,,插入的数据为:{a}")q.put(a)time.sleep(1)  with ThreadPoolExecutor(max_workers=5) as tpool:tpool.submit(work)
  6. map方法(任务函数,参数): 用于批量任务提交

    1. map()方法去提交单个参数
    def work(name):for i in range(3):print("========= 这是{}执行的第{}轮测试=========".format(name, i))time.sleep(1)with ThreadPoolExecutor(max_workers=5) as tpool:# 1.map方法tpool.map(work,[1,2,3,4,5])   # 与上面的map方法一样的效果# 2.submit方法for i in range(5):tpool.submit(work)
    print("---------------------- 结束执行 -----------------------")
    
    1. map()方法去提交多个参数
    def work(name,age):for i in range(3):print("========= 这是{}执行的第{}轮测试,只有{}个=========".format(name,i,age))time.sleep(1)with ThreadPoolExecutor(max_workers=5) as tpool:# 1.submit方法tpool.submit(work,'henry',18)# 2.map方法tpool.map(work, ['henry', 'henry1'], [17, 18])   # 以数组的方式print("---------------------- 结束执行 -----------------------")
    

二、ProcessPoolExecutor 进程池

  1. 进程池执行器:ProcessPoolExecutor类

    1. 快速导入:from concurrent.futures import ProcessPoolExecutor
  2. 如何使用:

    1. 创建一个进程池对象:创建一个进程池对象: ProcessPoolExecutor(max_workers=5)
      参数:max_workers 表示最大可同时执行的进程数
    1. submit(任务函数)方法: 去提交任务执行
    1. shutdown()方法: 等待进程池中所有的任务执行完毕之后,在往下执行
    1. map(任务函数,参数)方法: 用于批量任务提交,前面参数是:任务函数 后面是任务函数参数
  3. ProcessPoolExecutor类基本语法使用:

    q = Queue()def work():for i in range(5): for a in range(20):  print(f"这是第{i}轮数据插入,,插入的数据为:{a}")q.put(a)time.sleep(1)  #if __name__ == '__main__':with ProcessPoolExecutor(max_workers=5) as tpool:tpool.submit(work)
    
  4. ProcessPoolExecutor类上下文管理协议的语法使用:

    1. 上下文管理协议的语法:

      with ThreadPoolExecutor(max_workers=5) as tpool:tpool.submit(提交的任务函数)
      
    2. 使用上下文管理器后,无需使用shutdown()方法,在使用 with 语句时,会调用时将 wait 设为 True ,会一样等待

      q = Queue()# 生产数据
      def work():for i in range(5): for a in range(20): print(f"这是第{i}轮数据插入,,插入的数据为:{a}")q.put(a)time.sleep(1)  with ProcessPoolExecutor(max_workers=5) as tpool:tpool.submit(work)
      
  5. 进程池之间的数据通信问题:

    1. 同一个进程中多个线程之间使用: queue.Queue
      import queue
      q1 = queue.Queue()
    1. 多个进程之间数据通信的队列:multiprocessing.Queue
      from multiprocessing import Queue
      q1 = Queue()
    1. 进程池之间数据通信:multiprocessing.Manager().Queue
      from multiprocessing import Manager
      q2 = Manager().Queue

    注意事项:

    1. 如果要使用Pool创建进程,就需要使用 multiprocessing.Manager()中的Queue(),而不是multiprocessing.Queue()
      否则会得到一条如下的错误信息:RuntimeError: Queue objects should only be shared between processes through inheritance.

    实例:

    def work1(q):for i in range(10):q.put(i)def work2(q):for i in range(10):print(q.get())if __name__ == '__main__':q2 = Manager().Queue()with ProcessPoolExecutor(max_workers=2) as pool:pool.submit(work1, q2)pool.submit(work2, q2)

concurrent.futures --- 启动并行任务(线程池)相关推荐

  1. python实现多线程的三种方法threading.Thread(模块)的继承实现和函数实现;以及concurrent.futures模块的线程池实现

    1.threading.Thread模块继承实现: import threading import timeclass TestThread(threading.Thread):def __init_ ...

  2. java怎么让main方法不退出_JAVA线程池原理源码解析—为什么启动一个线程池,提交一个任务后,Main方法不会退出?...

    public static void main(String[] args) { ExecutorService service = Executors.newFixedThreadPool(10); ...

  3. python线程池模块_python并发编程之进程池,线程池,协程(Python标准模块--concurrent.futures(并发未来))...

    需要注意一下 不能无限的开进程,不能无限的开线程 最常用的就是开进程池,开线程池.其中回调函数非常重要 回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去 ...

  4. python 线程池 concurrent.futures ThreadPoolExecutor

    python 线程池 concurrent.futures ThreadPoolExecutor 步骤: 1,导包from concurrent.futures import ThreadPoolEx ...

  5. 线程队列 线程池 协程

    1 . 线程队列 from multiprocessing Queue , JoinableQueue  #进程IPC队列 from queue import Queue  #线程队列  先进先出 f ...

  6. Python线程池与进程池

    Python线程池与进程池 前言 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识 ...

  7. Python线程池、进程池的介绍与使用

    文章目录 1.问题背景 2.单线程→\rightarrow→多线程→\rightarrow→线程池 2.1单线程简介 2.2多线程简介 2.3线程池介绍 2.3.1复用线程 2.3.2线程池的使用 3 ...

  8. python线程池模块_python并发编程之进程池,线程池,协程

    需要注意一下 不能无限的开进程,不能无限的开线程 最常用的就是开进程池,开线程池.其中回调函数非常重要 回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去 ...

  9. python 进程池、线程池 与异步调用、回调机制

    进程池.线程池使用案例 from concurrent.futures import ProcessPoolExecutor # 进程池模块 from concurrent.futures impor ...

最新文章

  1. 计算机管理信息系统大作业,管理信息系统期末大作业
  2. 基于GIS的视频管理指挥平台
  3. JavaScript基础笔记
  4. Strontium-90和Raspberry Pi可以教大学生,Thyrosim可以治疗甲状腺,还有更多新闻
  5. java 双循环是如何执行的_java – 双循环赛
  6. Perl内置特殊变量
  7. 帝国php数据库备份,解决帝国cms帝国数据库备份王php5.3下500错误
  8. C++ #include iostream #include iostream.h #include string.h区别及作用
  9. 基于禁忌搜索算法的TSP搜索算法
  10. NetApp 数据存储解决方案
  11. 计算机音乐蜡笔小新,蜡笔小新背景音乐-原创
  12. PHP简单实现个人网站
  13. Andorid 安卓接入支付宝支付(当面付)
  14. Docker 学习之 Docker 容器数据卷
  15. 参会指南 | 5月20日WAVE SUMMIT 2021,一起和AI来场约会吧!
  16. 【C++】继承详解,菱形继承问题
  17. 2020年11个Redis系列高频面试题,哪些你还不会?
  18. 利用 OrthoFinder、IQtree、Notung、iTOL 绘制基因树
  19. Windows Store Aplication - WorkDo隐私策略
  20. 计算机系统结构------张晨曦 (第二版)

热门文章

  1. 关于JS运算,出现多余小数点尾数,浮点问题处理
  2. python+selenium统计CSDN博客(上):统计阅读量
  3. for(i=0,j=0;i10,j10;i++,j++)用python怎么写
  4. JDK11安装教程(手把手配置,也适用于其他jdk版本)
  5. 麦子学院美国商务中心成立,探索在线教育新高点www.maiziedu.com
  6. PCB设计中常见的八个问题及解决方法
  7. c || 结构体 联合体 枚举类型 字符串
  8. ENVI IDL 实现 高分6号(GF-6)WFV 影像辐射定标
  9. 电脑开机时自动开启小键盘
  10. python矩阵的右下半部分【简单易懂,代码可以直接运行】