ThreadPoolExecutor使用浅谈
1. 基础介绍
ThreadPoolExecutor是Python标准库concurrent.futures模块中的一个类,用于实现线程池的功能。
ThreadPoolExecutor模块相比于threading等模块,通过submit方法返回的是一个Future对象,它代表了一个未来可期的结果。通过Future对象,我们可以在主线程(或主进程)中获取某个线程(或任务)的状态以及返回值,实现了多线程和多进程编码接口的一致性。
具体来说,Future对象具有以下特点:
获取状态和返回值:通过
result()方法可以获取一个任务的执行结果。如果任务尚未完成,调用result()方法会阻塞主线程,直到任务完成并返回结果。异步通知:当一个线程完成时,主线程可以立即得到通知。可以通过
done()方法判断任务是否已完成,或使用add_done_callback()方法注册一个回调函数,在任务完成时自动调用该函数。异常处理:如果任务抛出异常,
Future对象会将异常抛出到主线程。可以使用exception()方法获取异常对象。
通过返回Future对象,我们可以更方便地管理和控制线程池中的任务。可以在主线程中获取任务的状态、返回值和异常信息,避免了线程之间的显式同步和等待。
总的来说,ThreadPoolExecutor模块提供了一种高级的多线程编程接口,使得多线程编程更加简洁和易用。它实现了多线程和多进程的编码接口一致性,使得我们可以使用类似的方式处理多线程和多进程编程任务。
2. 基础使用
创建线程池对象
可以使用ThreadPoolExecutor类创建一个线程池对象。可以指定线程池的大小(即可同时运行的线程数量),也可以使用默认值(大小为系统默认的处理器数量)。
from concurrent.futures import ThreadPoolExecutor
import time def get_html(times):
time.sleep(times)
print("get page {} success".format(times))
return times executor = ThreadPoolExecutor(max_workers=2) # 表示在这个线程池中同时运行的线程有3个线程
提交任务
使用submit()方法向线程池提交任务,该方法接受一个可调用对象(函数、方法等)作为参数,并返回一个Future对象,表示异步执行的结果。
def my_task(arg):
# 执行任务的代码
return result # 提交任务到线程池
future = executor.submit(my_task, arg)
获取任务结果
可以使用Future对象的result()方法来获取任务的结果。如果任务尚未完成,result()方法会阻塞当前线程,直到任务完成并返回结果。
# 获取任务的结果
result = future.result()
获取一组任务结果
使用submit()方法向线程池提交一组任务,并获取返回的Future对象列表,使用as_completed()函数迭代处理Future对象列表,它会在任务完成时产生结果。可以使用next()函数或直接使用for循环来获取结果
def my_task(arg):
# 执行任务的代码
return result args = [arg1, arg2, arg3, ...]
futures = [executor.submit(my_task, arg) for arg in args] # 使用next()函数获取每个任务的结果
for future in as_completed(futures):
result = future.result()
# 处理任务结果 # 或者使用for循环获取每个任务的结果
for future in as_completed(futures):
result = future.result()
# 处理任务结果
批量提交任务
除了逐个提交任务,还可以使用map()方法批量提交任务。map()方法接受一个可调用对象和一个可迭代的参数列表,然后并行地对参数列表中的每个参数调用可调用对象,并返回一个迭代器,用于获取每个任务的结果。
def my_task(arg):
# 执行任务的代码
return result args = [arg1, arg2, arg3, ...] # 批量提交任务并获取结果
results = executor.map(my_task, args)
等待任务完成
使用wait()方法等待所有已提交的任务完成。可以指定超时时间,如果超时时间到达而还有任务未完成,则不再等待并返回结果。
from concurrent.futures import ALL_COMPLETED, FIRST_COMPLETED # 等待所有任务完成
executor.wait(futures) # 等待任意任务完成
executor.wait(futures, return_when=FIRST_COMPLETED) # 等待所有任务完成或达到超时时间(单位为秒)
executor.wait(futures, timeout=10)
wait()方法接受三个参数:
fs:要等待的Future对象列表。timeout:可选参数,指定等待的超时时间(单位为秒)。如果超时时间到达而还有任务未完成,则不再等待并返回结果。return_when:可选参数,指定返回结果的条件。默认为ALL_COMPLETED,表示等待所有任务完成;也可以指定为FIRST_COMPLETED,表示等待任意一个任务完成。
关闭线程池
在不再需要线程池时,应该调用shutdown()方法关闭线程池。关闭线程池后,将不再接受新的任务提交,但会等待已提交的任务完成。
# 关闭线程池
executor.shutdown()
ThreadPoolExecutor使用浅谈的更多相关文章
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
- 浅谈angular2+ionic2
浅谈angular2+ionic2 前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别. 1. 项目所用:angular2+ionic2 ...
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- Linux特殊符号浅谈
Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...
- 浅谈Angular的 $q, defer, promise
浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00 博客园-原创精华区 原文 http://www.cnblogs.com/big-snow/ ...
- 浅谈Hybrid技术的设计与实现第三弹——落地篇
前言 接上文:(阅读本文前,建议阅读前两篇文章先) 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 根据之前的介绍,大家对前端与Native的交互应该有一些简单的认识了,很多 ...
随机推荐
- MAUI中Windows的标题栏颜色怎么设置
如下图所示,MAUI中Windows下的标题栏是灰色的,如何设置颜色,找了很久,在GitHub上的issue中找到了答案, 找到/Platforms/Windows/App.xaml <maui ...
- OOP第三次大作业
前言 前言的前言 快期末,也一直在等这次作业发布,我现在只能说终于等到了!!!跟上一个Blog的时间相隔比较大,内容也比较多,涉及范围也比较广7-11次小练习,废话不多说,直接开始吧.如果对我blog ...
- Go的函数定义
格式: 1 func function_name( [parameter list] ) [return_types] { 2 函数体 3 } 注释: func:函数由 func 开始声明 funct ...
- 采用PCA算法&KMeans算法来实现用户对物品类别的喜好细分(菜篮子分析)(附带数据集下载)
实现该项目的流程如下 """ 项目:用户对物品类别的喜好细分(菜篮子分析) 主算法:PCA降维算法 KMeans算法 总思路 1.导包 2.获取数据 3.数据处理 5.特 ...
- Baby_python 反编译
ok,直接pyc直接反编译 逻辑清楚 拿到flag直接搞 结果提交给错了我把前缀改成flag{}这种格式也给错真是摸不着头脑 难道是base64解密错误?? 找了另外一个网站 ???这个是啥?? 与之 ...
- Java应用堆外内存泄露问题排查
问题是怎么发现的 最近有个java应用在做压力测试 压测环境配置: CentOS系统 4核CPU 8g内存 jdk1.6.0_25,jvm配置-server -Xms2048m -Xmx2048m 出 ...
- Spark RDD惰性计算的自主优化
原创/朱季谦 RDD(弹性分布式数据集)中的数据就如final定义一般,只可读而无法修改,若要对RDD进行转换或操作,那就需要创建一个新的RDD来保存结果.故而就需要用到转换和行动的算子. Spark ...
- 行行AI人才直播第17期:无界AI联合创始人马千里《AIGC,比生产力还多》
谁也没有想到,短短几个月内,AI就在各行各业掀起了一阵狂风暴雨.ChatGPT.Stable Diffusion.Midjourney--AI已经变得十八般武艺样样精通,不仅能够高效率完成很多日常工作 ...
- 非全自研可视化表达引擎-RuleLinK
说在前面 工作中经常会遇到这样的场景: 帮忙把小贝拉门店 商品金额在5w以内,产康订单最多95折. 帮忙把圣贝拉门店 开业时间在6个月内,折扣低于7折要发起审批 帮忙把宁波太平洋店设置独立合同模板 帮 ...
- API对接需求如何做需求调研,需要注意什么?
随着互联网的发展,越来越多的企业开始将自己的业务系统通过API接口与其他系统进行对接,以便于数据的共享.协同操作等.在进行API对接之前,需要对用户需求进行深入的调研,以便于能够准确的设计出满足用户需 ...