python线程池ThreadPoolExecutor的用法

2023-05-16

为了释放python GIL锁实现多个任务的并发运行(实际上并非真正的并行只是看起来并发),往往采用多线程或者线程池的方式来实现。

从Python3.2开始,concurrent.futures模块提供了线程池ThreadPoolExecutor和进程池ProcessPoolExecutor两个对象,线程池模块和进程池模块通过submit提交一个任务并返回一个future对象,它是一个未来可期的对象,通过它可以获得线程或进程的任务执行状态及执行结果。

1. ThreadPoolExecutor基本用法

import time
from concurrent.futures import ThreadPoolExecutor


def io_bound_work(page):
    time.sleep(page)
    print(f"work {page} finished.")
    return page


if __name__ == '__main__':
    executor = ThreadPoolExecutor(max_workers=32)  # ThreadPoolExecutor构造示例,max_workers参数表示最多工作的线程数
    future_1 = executor.submit(io_bound_work, 1)  # 提交线程需要执行的任务到线程池中,并返回该任务的句柄,注意submit()不是阻塞的,而是立即返回的
    future_2 = executor.submit(io_bound_work, 2)
    future_3 = executor.submit(io_bound_work, 3)

    # 通过done()方法来判断线程是否完成, True表示已完成、False表示未完成
    print(f"future_1 {future_1.done()}")
    print(f"future_2: {future_2.done()}")
    print(f"future_3: {future_3.done()}")

    # 通过result()来获取线程返回的结果, timeout为获取结果的最长等待时间, 若为None则一直等待直到线程结束
    print(f"main 1 result: {future_1.result(timeout=None)}")
    print(f"main 2 result: {future_2.result(timeout=None)}")
    print(f"main 3 result: {future_3.result(timeout=None)}")

运行结果:

future_1 False
future_2: False
future_3: False
work 1 finished.
main 1 result: 1
work 2 finished.
main 2 result: 2
work 3 finished.
main 3 result: 3

2. wait方法

import time
from concurrent.futures import ThreadPoolExecutor, wait, FIRST_COMPLETED, ALL_COMPLETED


def io_bound_work(page):
    time.sleep(page)
    print(f"work {page} finished.")
    return page


if __name__ == '__main__':
    executor = ThreadPoolExecutor(max_workers=32)
    work_list = [executor.submit(io_bound_work, i) for i in range(1, 4)]

    # fs:要执行的序列, timeout:等待的最大时间, return_when:wait返回结果的条件;
    # ALL_COMPLETED等待全部线程执行结束后返回, FIRST_COMPLETED等待第一个线程结束时返回, FIRST_EXCEPTION线程一旦产生异常事件就结束
    ret = wait(fs=work_list, timeout=None, return_when=FIRST_COMPLETED) # 返回的条件是当完成第一个任务时返回
    print(f"work_list FIRST_COMPLETED, ret:{ret}")  # wait的返回值包含了已完成done和未完成not_done的句柄

    ret = wait(fs=work_list, timeout=None, return_when=ALL_COMPLETED)  # 返回的条件是当完成所有任务时返回
    print(f"work_list ALL_COMPLETED, ret:{ret}")

运行结果:

work 1 finished.
work_list FIRST_COMPLETED, ret:DoneAndNotDoneFutures(done={<Future at 0x19e0ef0b9a0 state=finished returned int>}, not_done={<Future at 0x19e0ef21d00 state=running>, <Future at 0x19e0ef219a0 state=running>})
work 2 finished.
work 3 finished.
work_list ALL_COMPLETED, ret:DoneAndNotDoneFutures(done={<Future at 0x19e0ef21d00 state=finished returned int>, <Future at 0x19e0ef0b9a0 state=finished returned int>, <Future at 0x19e0ef219a0 state=finished returned int>}, not_done=set())

3. as_completed方法

import time
from concurrent.futures import ThreadPoolExecutor, as_completed


def io_bound_work(page):
    time.sleep(page)
    print(f"work {page} finished.")
    return page


if __name__ == '__main__':
    executor = ThreadPoolExecutor(max_workers=32)
    work_list = [executor.submit(io_bound_work, i) for i in range(1, 4)]

    for future in as_completed(work_list):  # 每完成一个线程响应一个结果,直到work_list中线程全部结束
        data = future.result()
        print(f"main: {data}")
    print('finished')

运行结果:

work 1 finished.
main: 1
work 2 finished.
main: 2
work 3 finished.
main: 3
finished

4. map方法

import time
from concurrent.futures import ThreadPoolExecutor


def io_bound_work(page):
    time.sleep(page)
    print(f"work {page} finished.")
    return page


if __name__ == '__main__':
    executor = ThreadPoolExecutor(max_workers=32)
    # fn: 线程要执行的函数, iterables:可迭代对象, timeout:等待线程执行的结果
    for result in executor.map(io_bound_work, [3, 2, 1], timeout=None):
        print(f"work result: {result}")

使用map方法,无需提前使用submit方法,map方法与python高阶函数map的含义相同,都是将序列中的每个元素都执行同一个函数。上面的代码对列表中的每个元素都执行 io_bound_work 方法,并分配各个线程。

map与as_completed()方法的结果不同,map输出顺序与列表的顺序相同,会先打印前面提交的任务返回的结果。
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python线程池ThreadPoolExecutor的用法 的相关文章

  • MFC(VC2010升级到VC2019)

    1 SDKDDKVer h No such file or directory 解决 xff1a 项目 属性 配置属性 常规 windowsSDK版本默认的时8 1 xff0c 但是windows10得更改 xff0c 点击右边下拉按钮 x
  • c# treeview单击树节点,两个节点来回切换闪烁

    使用AfterSelect可以解决这个问题 修改前事件 修改后事件
  • ROS2简介

    转载地址 ROS简介 ROS是Robot Operating System的缩写 xff0c 是一套开源的软件框架和工具集 xff0c 用来帮助开发人员建立机器人应用程序 xff0c 它提供了硬件抽象 设备驱动 函数库 可视化工具 消息传递
  • Task Parallel Library in C#

    文章目录 Task Parallel Library in C with Examples TPL in C Introduction to ParallelismWhat is Parallel Programming in C Why
  • C# winform事件执行顺序

    转载地址 https www cnblogs com luoyaoquan archive 2011 06 30 2094255 html 目录 Paint事件Load事件Refresh方法 进入控件时 xff1a 先激发OnEnter后激
  • 如何:在窗体一级处理键盘输入

    转载地址 https learn microsoft com zh cn dotnet desktop winforms how to handle keyboard input at the form level view 61 netf
  • 完美解决xhost +报错: unable to open display ""

    详细很多朋友在装oracle的时候总是在弹出安装界面的时候出错 xff0c 界面就是蹦不出来 oracle安装 先切换到root用户 xff0c 执行xhost 43 然后再切换到oracle用户 xff0c 执行export DISPLA
  • IEC104报文解读

    104规约大致有1997年和2002年 xff08 02版 xff09 两个版本 xff0c 在配置上没什么变化 xff0c 只是02版在97版上扩展了遥测 遥信等信息体起始地址 xff0c 区别如下 xff1a 类别 97 版 02 版
  • 单点要信双点遥信区别

  • log以2为底的对数

  • gdb几种设置断点的方式

    gdb几种设置断点的方式 方式1 根据函数名 xff0c 查找符号 xff08 symbol xff09 设置断电 此种方式最为简单 xff0c 阅读源代码 xff0c 了解函数如何调用 xff0c 在需要暂停运行的函数入口进行断点设置 但
  • Ubuntu常用命令

    一 创建新用户 1 创建用户testuser xff1a span class token variable sudo span adduser testuser 按照提示填写密码等信息 xff0c 可以一路回车默认 2 将用户添加到指定用
  • redis del与unlink命令用法及实现

    1 DEL 命令 DEL key key 删除指定的一批keys xff0c 如果删除中的某些key不存在 xff0c 则直接忽略 返回值 integer reply xff1a 被删除的keys的数量 例子 redis gt SET ke
  • ORA-01033错误解决方案

    今天在linux测试环境下登录sqlplus 不能正常登录报 xff1a ORA 01033错误 xff0c 捣鼓了半天 xff0c 参考网上的一些经验 xff0c 终于解决 xff0c 把心得总结一下 一 首先 xff1a 问题的产生原因
  • 四川麻将纯AI算法------最优拆牌

    ps 四川麻将AI算法已经开发完毕 xff0c 现已上线运营 xff0c 有需要交流的朋友请留言交流讨论 转载请说明出处 xff1a by wojiushi3344 我想现实生活中应该有很多朋友都在玩四川麻将 xff0c 不知道你有没有发现
  • Ubuntu 安装 HDF5 C++库

    HDF5 HDF5安装教程在源码包中的release docs文件夹中的INSTALL文件中有详细介绍 下载 根据系统选择下载源码包 xff0c 否则导致编译出错 xff1a https support hdfgroup org ftp H
  • C++和Windows平台的一些书籍

    从2010年学习编程以来 xff0c 到现在有差不多3年时间了 xff0c 过的真快啊 目前在深圳工作 xff0c 主要使用的是C 43 43 语言 xff0c 那么我就说说C 43 43 和Windows平台的书籍吧 1 C primer
  • Windows程序设计 截屏

    span style font family none span BLOWUP C Video Magnifier Program c Charles Petzold 1998 include lt windows h gt include
  • windows 程序设计 调色板

    调色板 这时就需要使用Windows调色盘管理器 xff08 在Windows 3 0中提出 xff09 了 Windows保留了256种颜色中的20种 xff0c 而允许应用程序修改其余的236种 xff08 在某些情况下 xff0c 应
  • windows程序设计 文字和字体

    文字和字体 简单的文字输出 让我们先来看看Windows为文字输出 影响文字的设备内容属性以及备用字体提供的各种函数 文字输出函数 我已经在许多范例程序中使用过最常用的文字输出函数 xff1a TextOut hdc xStart ySta

随机推荐

  • windows 网络编程 WinNet

    初始化 winNet 库 HINTERNET InternetOpen LPCTSTR lpszAgent DWORD dwAccessType LPCTSTR lpszProxyName LPCTSTR lpszProxyBypass D
  • Cocos 随写

    auto listenter 61 EventListenerTouchOneByOne create 设置单点触摸 listenter gt onTouchBegan 61 Touch pTouch Event event gt bool
  • android NDK崩溃信息调试

    android NDK崩溃 调试 主要利用 tombstones xff0c 可以看成是普通linux上利用core文件调试查问题类似 一 tombstones简介 1 什么是tombstone 当独立ndk bin方式或者jni方式开始运
  • 延迟加载DLL[转]

    问题来源 我的应用程序需要用到D3DX9 41 dll 程序里用的静态加载 xff0c 这个dll通常是把它放在根目录下 xff0c 否则应用程序找不到dll 但是有一天 xff0c 我需要把他放到别的目录 xff0c 那么下面就是一个解决
  • C++11 lambda 表达式

    lambda 表达式也是一种可调用对象 xff0c 那么可调用对象有哪些呢 xff1f 有函数 xff0c 函数指针 xff0c 重载了调用运算符的类 xff0c 还有lambda表达式 1个lambda表达式表示一个可调用的代码单元 xf
  • Windows核心编程之 2 字符和字符串

    1 包含新的安全是字符串处理头文件 StrSafe h counof 宏可以计算缓冲区的元素个数 StringCchCat StringCchCopy StringCchPrintf 34 Cch 34 表示 字符数 StringCbCat
  • Windows核心编程之 用户模式下的线程同步 读写锁和条件变量

    读写锁 include lt Windows h gt include lt tchar h gt include lt stdio h gt include lt process h gt include lt winbase h gt
  • 八戒常用之php时间戳strtotime前一天或后一天的日期

    date default timezone set 39 PRC 39 默认时区 今天 date 34 Y m d 34 time 昨天 date 34 Y m d 34 strtotime 34 1 day 34 明天 date 34 Y
  • 信号量和互斥锁的区别

    信号量和互斥锁 xff1a 信号量 xff08 semaphore sem f r xff09 用在多线程多任务同步的 xff0c 一个线程完成了某一个动作就通过信号量告诉别的线程 xff0c 别的线程再进行某些动作 而互斥锁 xff08
  • VLC生成流媒体实时流

    VLC生成实时流 xff0c 分为以下步骤 1 打开VLC xff0c 如果未下载可在官网下载 2 现在将要产生流的视频文件选中 3 开始产生流 4 检验流的生成 转载请注明出处 xff1a http www wolfnx com 2017
  • nmap 缺少module 'citrixxml'以及citrixxml.lua的修补

    当使用nmap的 script功能时 xff0c 可以参考nmap脚本使用总结 xff0c 但是在ubuntu12 04 LTS下使用默认下载安装的nmap xff08 版本为5 21 xff09 时 xff0c 当运行nmap scrip
  • 【ROS】Ubuntu18.04安装IntelRealsense D435

    参考文章 xff1a 文章一 文章二 这两篇文章多多少少和自己的有点不一样 xff0c 故在此记录 以实际为准 从官网https github com IntelRealSense librealsense下载安装包 xff08 用git的
  • 利用ROS同时采集激光雷达、摄像头数据并提取信息

    利用ROS同时采集激光雷达 摄像头数据并提取信息 在实际工程中 xff0c 往往需要采集lidar和camera的信息 xff0c 并进行同步 xff0c 而二者的频率往往不一致 xff0c 比如相机的采集频率为30HZ xff0c 而ve
  • C#连接SQLserver数据库

    导入命名空间 span class token keyword using span span class token namespace System span class token punctuation span Configura
  • MTK编译记录

    MTK编译记录 系统编译1 Q FAILED check kernel config 系统编译 1 Q FAILED check kernel config bin bash c python device mediatek build b
  • Git回退到指定版本

    Git版本回退 xff0c 在idea中不方便操作 xff0c 需进行强制提交 主要使用reset和push f进行强制回退 1 git 命令行回退到某个指定的版本 1 在开发过程中遇到合并别人的代码或者合并主分支的代码导致自己的分支代码冲
  • 四旋翼无人机crazepony烧写流程

    开源crazepony 自上而下 xff0c 从产品到底层的学习方法是效率比较高的 事前准备 xff1a 编译stm程序用的是Keil 5 xff0c 官方推荐用5不用4 4不支持Unicode8 xff0c 怕是不支持中文输入 在用官方包
  • deb 打包、安装、卸载

    deb 打包 安装 卸载 deb 格式是 Debian 系统 包含 Debian 和 Ubuntu 专属安装包格式 dpkg 是 Debian下的包管理工具 xff0c 用来执行软件包的打包 解包 安装 卸载等命令 运行环境 xff1a D
  • Kafka高可用 — KRaft集群搭建

    Apache Kafka Raft 是一种共识协议 xff0c 它的引入是为了消除 Kafka 对 ZooKeeper 的元数据管理的依赖 xff0c 被社区称之为 Kafka Raft metadata mode xff0c 简称 KRa
  • python线程池ThreadPoolExecutor的用法

    为了释放python GIL锁实现多个任务的并发运行 xff08 实际上并非真正的并行只是看起来并发 xff09 xff0c 往往采用多线程或者线程池的方式来实现 从Python3 2开始 xff0c concurrent futures模