使用concurrent.futures模块快捷方便的进行多线程(池)或多进程(池)操作(python)

Python中使用concurrent执行多进程任务 多进程技术是独立于算法任务本身的一种优化技术,通过python中的concurrent库,我们可以非常容易的实现多进程的任务,用来优化已有的算法。这里我们也给出了一些多进程配置信息的参考方案,在GPU和超算相关的领域上,都能够发挥较大的用途。 阅读详情

在这里插入图片描述
之前已经介绍过了python的multiprocessing包相关的使用方法,实际上在python3.2版以后新加入了concurrent.futures模块。这个模块拥有线程池及进程池执行对象即Executor()。对比起多线程和多进程的其它模块,此模块包含了两种多进程多线程两种方式,且使用更加简单。使用时根据自身需要选择使用哪一个包。
concurrent.futures模块中含有ThreadPoolExecutor与ProcessPoolExecutor两个池执行器,操作方式类似,本文主要以ThreadPoolExecutor为例进行介绍


future对象

Future对象能够储存异步执行的任务,即其能代表一个正在执行的任务,这也说明了future对象的产生和运行是非阻塞的。future对象所接受的任务都是由ThreadPoolExecutor或者ProcessPoolExecutor产生的,future对象储存这些任务。通过调用future对象能够了解到这些任务的完成情况。因此future对象具有一系列的方法如下表:

方法作用
cancel()尝试取消调用,如果该调用正在执行中,无法取消,本方法返回 False,其他情况下调用会被取消,并返回 True
cancelled()判断是否被取消
running()判断是否正在运行
result()获取结果
add_done_callback()添加回调函数
done()判断是否结束
exception获取异常

submit()

一个submit运行一次需要传入一个函数和执行一次函数需要的参数。因此调用一次submit只能执行单个任务,要使用submit执行多个任务就需要将不同的参数分配给submit,从而执行多线程任务。

例:

from concurrent.futures import ThreadPoolExecutor    # 导入线程池执行器
import time                                          # 导入time模块,计算花费时间

def test(g):
    time.sleep(2)                   # 函数中休眠2s
    return g                        # 设置返回值

if __name__ == '__main__':
    record = []                     # 创建列表放置后续产生的future对象
    t = time.time()                 # 记录开始运行的时间
    with ThreadPoolExecutor(max_workers=10) as executor:  
    # 线程池的使用方式,由于是with方式,因此不需要自己关闭。同时线程池会自动join()
    # 当然也可以使用executor = ThreadPoolExecutor(max_workers=4),但需要在使用结束后使用
    # shutdown方法,才能阻塞主线程。 代码也贴上啦,在下面。
        for l in list(range(5)):			  # 创建一个参数列表用于后续传入函数
            future = executor.submit(test,l)  
            # 传入要执行的函数及参数,返回的是一个future对象,注意这里不要调用,此处调用会使线程阻塞。
            record.append(future)             # 将对象添加到record列表中
        for future in record:               
            print(future.result())			  # 打印每个返回值
    print('程序结束')       	# 测试主线程是否阻塞
    print(time.time()-t)   	# 打印程序花费时间

结果如下:

在这里插入图片描述
可以看到运行结果达到了预期,即运行使用了多线程,本该运行10s的任务在2s内完成了。

另一种方法

from concurrent.futures import ThreadPoolExecutor
import time

def test(g):
    time.sleep(2)
    return g

if __name__ == '__main__':
	record = []
    t = time.time()
    pool = ThreadPoolExecutor(max_workers=10)
    for l in list(range(5)):
        res = pool.submit(test,l)
        record.append(res)
    for p in record:
        print(p.result())
    pool.shutdown()    # 关闭线程池,同时起到join的效果
    print('程序结束')
    print(time.time()-t)

map()

map同submit一样都是执行任务的,但是map可以同时添加多个任务。将某个可迭代的参数库与某函数直接map起来,较submit更为方便。

例:

from concurrent.futures import ThreadPoolExecutor
import time

def test(g):
    time.sleep(2)
    return g
    
if __name__ == '__main__':
    t = time.time()
    with ThreadPoolExecutor(max_workers=10) as pool:
        results = pool.map(test,range(5))   # 产生一个生成器generator,可以从中获取结果
        for result in results:
            print(result)
    print('程序结束')
    print(time.time()-t)

运行结果如下:

在这里插入图片描述

wait()与as_completed()

  • wait方法可以让主线程阻塞,直到满足设定的要求。有三种条件ALL_COMPLETED, FIRST_COMPLETED,FIRST_EXCEPTION
  • as_completed同样也与主进程阻塞有关(即需要所有future对象都运行结束才结束阻塞)。

看例子理解一下吧,例:


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

def test(g):
    time.sleep(2)       
    return g

if __name__ == '__main__':
    record = []
    t = time.time()
    with ThreadPoolExecutor(max_workers=10) as executor:
        for l in list(range(5)):
            future = executor.submit(test,l)
            record.append(future)
        wait(record, return_when=FIRST_COMPLETED)    # 第一次完成后即不再阻塞
        print('第一次运行结束')         # 测试第一次完成后是否不再阻塞
        for future in as_completed(record):   # 其实就相当于之前的shutdown操作
            print(future.result())            # 并不按顺序提取,谁先完成就先打印,此处看不出来
    print('程序结束')
    print(time.time()-t)
    

结果如下:

在这里插入图片描述

叮!

此模块中多进程和多线程的使用方式应该差不多,这里就不再赘述咯!

多进程相关的内容看了很多,也写了好几篇,因为感觉挺重要的。虽说花了一些时间,但之后用上的时候应该会更加熟练一点吧!本文介绍的内容应该也足以应付平常用到的工作了吧。

参考:concurrent.futures进行并发编程
参考:Python 中 concurrent.futures 模块使用说明

python:concurrent.futures --- 启动并行任务 阅读详情

相关推荐

使用Python的concurrent.futures模块简化多线程与多进程编程

在这个示例中,我们创建了一个包含3个进程的进程池,并提交了5个CPU密集型任务到进程池中。注意,由于进程间通信的开销较大,因此进程池适合于CPU密集型任务,而不是IO密集型任务。在实际应用中,我们可以根据任务的性质和系统的资源来选择使用线程池还是进程池。由于进程之间的内存是隔离的,因此进程池特别适合于CPU密集型任务,或者需要避免全局解释器锁(GIL)的场景。在这个示例中,我们创建了一个包含3个线程的线程池,并提交了5个任务到线程池中。模块是一个相对高级的接口,它简化了多线程和多进程的创建和管理。

weixin_71166183的博客 765

python3线程池 多线程

从Python3.2开始,标准库为我们提供了 concurrent.futures 模块,它提供了 ThreadPoolExecutor (线程池)和ProcessPoolExecutor (进程池)两个类。 相比 threading 等模块,该模块通过 submit 返回的是一个 future 对象,它是一个未来可期的对象,通过它可以获悉线程的状态主线程(或进程)中可以获取某一个线程(进程)执行的状态或者某一个任务执行的状态及返回值: 主线程可以获取某一个线程(或者任务的)的状态,以及返回值。 当一

qq_27886997的博客 1564

python爬虫实战——猫眼电影案例

python爬虫实战——猫眼电影案例 AJ-Gordon,数据分析师一枚,对爬虫,机器学习,数据可视化,数据建模均有所涉猎。 ·背景   笔者上一篇文章《基于猫眼票房数据的可视化分析》中爬取了猫眼实时票房数据,用于展示近三年电影票房概况。由于数据中缺少导演/演员/编剧阵容等信息,所以爬取猫眼电影数据进行补充。关于爬虫的教学内容,网络上一搜就有很多了,这里我以个人的爬虫习惯,介绍此次过程中所用到的库...

guoxulong1的博客 5117

concurrent.futures.wait异步执行模块函数

摘录自官方文档 模块函数 wait是concurrent.futures模块的一个函数。 concurrent.futures.wait(fs, timeout=None, return_when=ALL_COMPLETED) 用于等待期程完成,并返回已完成的和未完成的。 参数 参数 数据类型 意义 fs Future 实例 等待 fs 指定的 Future 实例(可...

漫步量化 3378

Qt for Python 从入门到部署:PySide6 环境搭建、打包与多线程实战

图形用户界面(GUI)开发是软件工程中的重要领域,其核心在于创建直观、响应式的用户交互层。Qt 作为成熟的跨平台 C++ 框架,通过信号与槽机制实现了高效的事件驱动模型,为构建复杂桌面应用提供了坚实基础。其技术价值在于将高性能的本地渲染能力与丰富的 UI 组件相结合,显著提升了应用的稳定性和用户体验。在应用场景上,Qt 广泛用于工业控制、嵌入式 HMI、多媒体工具及科学计算软件。通过 PySide6 这一官方绑定库,开发者得以利用 Python 的简洁语法和丰富生态来调用 Qt 的强大功能,实现快速原型开发

weixin_34384557的博客 342

告别数据孤岛:手把手教你用Python脚本把华为备忘录搬到iPhone(附完整代码)

本文详细介绍了如何使用Python脚本实现华为备忘录到iPhone的无缝转移,解决跨平台数据迁移难题。通过解析华为云空间的JSON数据并转换为iPhone兼容的TXT格式,帮助用户高效完成备忘录迁移,保留原始内容和时间戳。文章包含完整代码和实用技巧,适用于Android到iOS的数据转移场景。

weixin_30279315的博客 515

列表操作的并行计算与多线程处理

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。最后祝大家天天进步!

Python栈_基的博客 1190

CTF竞赛Python自动化脚本编写指南:从环境搭建到实战案例

在网络安全和CTF竞赛领域,自动化脚本是提升解题效率的核心技术。其基本原理是将重复性、机械化的操作转化为程序指令,由计算机高效执行,从而让选手专注于核心的逻辑分析与策略思考。这项技术的核心价值在于解放人力,实现解题流程的标准化与复用,尤其在时间紧迫的竞赛环境中至关重要。从应用场景来看,自动化脚本广泛应用于Web渗透测试的参数爆破、逆向工程的交互式解题、密码学的编码解码以及杂项题目的数据分析等环节。本文聚焦于使用Python语言实现CTF自动化,通过requests库处理网络请求、pwntools进行交互控制

weixin_30613727的博客 431

Python爬虫实战案例一:爬取猫眼电影

笔者上一篇文章《基于猫眼票房数据的可视化分析》中爬取了猫眼实时票房数据,用于展示近三年电影票房概况。由于数据中缺少导演/演员/编剧阵容等信息,所以爬取猫眼电影数据进行补充。关于爬虫的教学内容,网络上一搜就有很多了,这里我以个人的爬虫习惯,介绍此次过程中所用到的库和代码。

2201_75362610的博客 4507

Python自动化破解Steghide隐写密码:从字典攻击到实战避坑

隐写术作为信息隐藏技术,通过将秘密信息嵌入图片、音频等载体实现隐蔽通信,其核心原理常利用文件格式的冗余数据位(如LSB替换)进行信息嵌入。在信息安全领域,针对隐写内容的分析与提取是隐写分析的关键环节,具有重要的攻防研究价值。Steghide作为经典的隐写工具,常被用于CTF竞赛和安全评估中。当Steghide加密文件需要密码提取时,手动尝试密码效率极低,自动化密码破解技术应运而生。通过Python脚本实现字典攻击、掩码攻击等自动化流程,能够系统性地尝试密码组合,并利用子进程调用、进度管理、断点续传等工程实践

327

Python键盘监听与自动化脚本开发:从pynput入门到热键管理器实战

键盘监听是自动化技术中的基础概念,它通过捕获系统级按键事件实现程序与用户的交互。其原理是利用操作系统提供的钩子(Hook)API,在后台线程中监控全局键盘输入,区分按键的按下(press)与释放(release)状态。这项技术的核心价值在于将重复性手动操作转化为自动化流程,极大提升办公、开发和日常使用效率。在Python生态中,pynput库因其跨平台特性和对组合键的精细控制,成为实现键盘监听的首选工具。通过维护一个按键状态机,开发者可以可靠地监听如Ctrl+Shift+A等复杂组合键,并触发自定义的自动化

weixin_34080951的博客 438

chatgpt赋能python:Python并行化:提高程序运行效率的利器

本文由chatgpt生成,文章没有在chatgpt生成的基础上进行任何的修改。以上只是chatgpt能力的冰山一角。作为通用的Aigc大模型,只是展现它原本的实力。对于颠覆工作方式的ChatGPT,应该选择拥抱而不是抗拒,未来属于“会用”AI的人。🧡AI职场汇报智能办公文案写作效率提升教程 🧡专注于AI+职场+办公方向。下图是课程的整体大纲下图是AI职场汇报智能办公文案写作效率提升教程中用到的ai工具。

reilust的博客 198

MCGS触摸屏Modbus TCP通讯实战:从寄存器写入到字符串处理的完整代码解析

本文详细解析了MCGS触摸屏通过Modbus TCP协议实现寄存器写入和字符串处理的完整代码,涵盖单寄存器写入、多寄存器写入及字符串传输等核心技术。文章还提供了MCGS组态环境中的实战配置步骤和常见问题排查方法,帮助开发者快速掌握工业自动化通讯的关键技术。

study的专栏 755

Python 3 标准库深度指南:从入门到精通

Python 被誉为“带着电池(batteries included)”的语言,这背后所指的正是其强大而全面的标准库(Standard Library)。它是一组随 Python 解释器一同安装的模块和包的集合,无需任何额外安装步骤(如),即可在您的代码中通过import关键字直接使用。从最简单的字符串操作到复杂的网络服务、从基础的数据结构到高级的并发编程,标准库提供了几乎所有通用编程场景的解决方案。核心优势零依赖部署。

浩瀚之水的专栏 502

Tina Linux WiFi驱动移植避坑指南:以RTL8733bs为例,详解设备树、Kconfig与固件依赖

本文详细解析了在Tina Linux上移植RTL8733bs WiFi驱动的关键步骤与常见问题,涵盖设备树配置、内核依赖、固件加载及启动时序等核心环节。通过实战案例和排查清单,帮助开发者规避SDIO控制器配置、电源管理、GPIO极性等典型陷阱,确保驱动稳定运行。

weixin_29164185的博客 260

Win11系统重装全记录:从备份Office激活到搞定RAID阵列,我的微星笔记本复活记

本文详细记录了Win11系统重装的完整过程,从数据备份到RAID阵列配置,特别针对微星笔记本的特殊硬件驱动问题提供了解决方案。文章涵盖了Office激活状态备份、BIOS设置、驱动安装顺序等关键步骤,帮助用户顺利完成系统重装并优化性能。

weixin_31421613的博客 309

Python并发编程:解决多任务协作中的“一起睡着”问题

在并发编程中,进程与线程的协作是核心概念。其原理涉及任务调度、状态同步和通信机制,旨在提升程序执行效率和资源利用率。技术价值在于通过合理的并发设计,可以避免程序阻塞,增强系统健壮性。应用场景广泛,包括自动化脚本、服务器后台任务和数据处理流水线等。本文聚焦于多任务协作中常见的“一起睡着”问题,即主任务因同步机制不当而被子任务永久阻塞的现象。通过分析阻塞与非阻塞、同步与异步等基础概念,并结合Python中的threading和concurrent.futures等库,提供了从超时机制到高层抽象的多种解决方案,帮

weixin_30875157的博客 444

WorkBench3.2 + VxWorks6.8安装教程

按照FTP连接主机和目标机,将整个VxWorks6.8的安装分为两个部分,一是在主机(win10系统,可以使用虚拟机或者实体机,推荐使用虚拟机)上安装workbench3.2,进行bootrom与VxWroks映像文件的生成,二是在虚拟机上安装VxWorks系统 19.10.10 首先很高兴文章能帮到大家,但由于本人已不做该方向良久,私信和评论的很多问题现在已经无法解答,如果大家有什么问题欢迎...

Alive的博客 3万+

Python自动化脚本实战:解析钓鱼网站机制与安全干扰技术

网络安全领域中,钓鱼攻击是一种常见的社会工程学手段,其核心原理是通过伪造合法网站或服务,诱导用户提交敏感信息。从技术实现角度看,钓鱼网站通常包含表单提交接口、数据存储后端及伪装前端,其安全防护往往较为薄弱。理解HTTP请求、会话机制及Web表单工作原理,有助于深入分析此类攻击的运作方式。在工程实践层面,利用Python的Requests库进行网络请求模拟,结合Faker库生成虚假数据,可以构建自动化脚本。这种技术方法的价值在于,既能用于安全研究中的攻击模拟与机制分析,也能在严格受控的伦理框架内,对已确认的非

weixin_30919429的博客 368

PCB仿真软件:Altium Designer_(18).PCB设计中的热管理

在PCB设计中,热管理是一个至关重要的环节。随着电子设备的集成度越来越高,功耗和发热量也随之增加,不合理的热设计可能导致电路板过热,从而影响电路的性能和可靠性。热管理不仅能够提高电路板的使用寿命,还能确保电路在各种环境条件下的稳定工作。本节将详细介绍如何在Altium Designer中进行有效的热管理,包括热分析、热设计和热仿真等关键步骤。

kkchenjj的博客 1985

Qt CEF融合技QCefView使用教程

如果从事C++客户端开发,对CEF应该不陌生,当C++界面需要和web交互时,CEF是很好的解决方案,当然Qt也提供了QWebEngineView来进行web交互,最近在万兴喵影的安装目录看到了QCefView.dll,之前也听说过这个库,没在意,没想到还真有人用到项目里面,于是决定自己编译写个demo看看......

琅嬛福地 1万+

Python金融数据利器:mootdx通达信数据读取框架深度解析

mootdx是一款基于Python的开源通达信数据读取框架,专为金融数据分析师和量化交易开发者设计。该工具提供了简洁高效的API接口,支持通达信离线数据读取、实时行情获取和财务数据分析,是进行股票市场研究和量化策略开发的理想选择。mootdx项目通过封装复杂的通达信数据格式,让Python开发者能够轻松访问中国A股市场的历史行情、实时报价和财务数据,极大提升了金融数据分析的工作效率。 ## 📊

gitblog_00238的博客 1047

R语言实战应用精讲50篇(二)-多重线性回归系列之稳健回归

前言 线性回归的参数估计主要采用的是最小二乘法(又称最小平方法),该法是将使观测值与模型预测值之差的平方达到最小的值作为参数估计值。如果数据存在异常点或者异方差,最小二乘法估计会存在偏差,常用的处理策略就是改用稳健回归(Robust Regression)。 稳健回归就是采用更为稳健的参数估计方法来拟合模型,所谓稳健就是数据的波动对参数估计影响不大,比如不受异常值影响,或删除某一观测后对结果影响不大。稳健估计的方法有很多,主要有这么几类:最小绝对值回归(也称最小一乘法回归,lAV),最小中位数二乘法(L

wenyusuran的专栏 3160

Python自动化办公:Word文档内容智能解析与Excel表格转换实战

在数据处理与办公自动化领域,非结构化文本向结构化表格的转换是提升效率的关键环节。其核心原理在于通过程序识别文档中的逻辑结构(如段落、列表、伪表格),并应用数据清洗与映射技术,将信息精准提取并重组为行列分明的表格数据。这一过程的技术价值在于彻底解放人力,实现批量、准确、可复制的文档处理,有效避免手动操作中的遗漏与格式错误。典型应用场景包括会议纪要整理、财务报告生成、产品需求汇总等日常办公与数据处理任务。本文聚焦于利用Python生态中的python-docx、pandas等库,构建一个灵活、健壮的自动化解决方

weixin_30367873的博客 322

Python实现商品价格监控与波动分析爬虫项目

本文通过完整的代码示例和详细的技术讲解,展示了如何实现商品价格的自动监控和波动分析。该项目不仅适用于个人购物助手,还可以扩展为商家的竞品监控工具。通过结合数据抓取、存储、分析与可视化,能够帮助我们更好地理解市场趋势并做出优化决策。

2201_76125261的博客 1742

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: python多进程multiprocessing包中queue、pipe、manager模块的功能介绍(超易懂哦!)
下一篇: 使用NCBI rpsblast寻找蛋白序列具有的保守Domain (本地版CD-search)
你大佬来啦
博客等级 码龄7年 322粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值