使用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

Unity游戏开发客户端面经——网络(初级)

Unity游戏开发客户端面经 之 网络 篇

Sea3752的博客 1万+

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

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

浩瀚之水的专栏 502

因果推断--PSM的原理和应用(二)

上一篇介绍了DID,本文介绍和DID可一起搭配使用的一种因果推断方法PSM。在正式介绍PSM之前,先来简单回顾一下为什么需要因果推断以及如何做因果推断。我们都知道相关非因果,比起相关我们更希望知道两个事件之间的因果关系,有了确切的因果关系,才能知道对A如何操作才能引起B的变化。解决因果推断问题,目前主要有两种框架,Rubin虚拟事实模型和Pearl因果图模型。站在数据分析的角度上,Rubin虚拟事实模型更容易理解,其核心思想是寻找恰当的对照组。

baidu_26137595的博客 1万+

[机器学习] 第二章 模型评估与选择 2.ROC:roc_curve原理及源代码详解

代码见:https://github.com/Carrie-Yi/machine_learning/tree/main/roc_curve

心宝的博客 1493

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

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

weixin_30875157的博客 444

科研绘图系列:R语言绘制差异蝴蝶图(Butterfly Chart)

科研绘图系列:R语言蝴蝶图(Butterfly Chart)

专注生信领域 1390

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

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

weixin_30919429的博客 368

车间数据孤岛终于破了!C#上位机+MQTT打通产线与MES,数据延迟从小时级降到秒级

本文针对工业上位机开发中常见的车间数据与企业管理系统(MES)割裂问题,提出基于C#和MQTT协议的完整解决方案。通过EMQX MQTT Broker实现数据实时双向传输,将质量追溯时间从2小时缩短至10秒,生产计划自动下发,实现秒级数据延迟。方案采用分层解耦架构,支持设备更换和系统升级,核心优势包括低延迟、高可靠性和易扩展性。文章详细介绍了MQTT协议选型理由、整体架构设计、技术选型(EMQX Broker和MqttNet客户端),并提供了C#实现代码和部署流程。该方案已在实际产线验证,可有效解决&quo

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 479

【Bug已解决】codex: rate limit 429 / Too many requests / RPM exceeded — CodeX CLI 速率限制解决方案

CodeX CLI 触发 429 速率限制(RPM/TPM/并发)的解决方案,含请求间隔、自动重试、便宜模型、Tier 升级与多 Key 轮换。

博客 4889

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

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

gitblog_00238的博客 1047

【回眸】Tessy集成测试软件使用指南(一)新手使用篇

这个专栏的文章前4篇都在记录如何使用Tessy进行单元测试,集成测试需要有一定单元测试基础,且做集成测试之前,需要做好单元测试,否则将会大幅增加软件单元代码纠错的代价。集成测试所花费的时间通常远远超过单元测试。如果直接从单元测试到系统测试,结果往往是不理想的。集成测试可以检测由于单元相互交互而导致的错误,通常由一组专业的测试人员执行。

啤酒鸭的物联网开发记录博客 5278

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

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

weixin_30367873的博客 322

[QMT量化交易小白入门]-二十八、有了回测年化收益好的策略,如何在QMT量化实盘呢(附python代码解析)

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步,自己淋过雨了,希望大家都有一把伞。

木头大左的博客 2924

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 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、付费专栏及课程。

余额充值