python 线程池调用返回结果处理
python多线程调用,如果使用threading.Thread这个如果没有返回值完全没问题,但是有返回的时候就很有问题
下面是一个sample
import threading,os,time,datetime
def fun1(num):print(f"线程名称:{threading.current_thread().getName()},线程ID:{threading.get_ident()},进程ID:{os.getpid()},开始时间:{datetime.datetime.now()}")time.sleep(1)print(f"执行第{num}次fun1函数")print(f"线程名称:{threading.current_thread().getName()},线程ID:{threading.get_ident()},进程ID:{os.getpid()},结束时间:{datetime.datetime.now()}")if __name__=='__main__':tasks=[]for i in range(10):t=threading.Thread(target=fun1,args=(i,))tasks.append(t)t.start()for i in tasks:i.join()
运行结果:
import threading,os,time,datetime
def fun1(num):print(f"线程名称:{threading.current_thread().getName()},线程ID:{threading.get_ident()},进程ID:{os.getpid()},开始时间:{datetime.datetime.now()}")time.sleep(1)print(f"执行第{num}次fun1函数")print(f"线程名称:{threading.current_thread().getName()},线程ID:{threading.get_ident()},进程ID:{os.getpid()},结束时间:{datetime.datetime.now()}")if __name__=='__main__':tasks=[]for i in range(10):t=threading.Thread(target=fun1,args=(i,))tasks.append(t)t.start()for i in tasks:i.join()
为了获取线程池执行的返回结果我们采用map方法
from concurrent.futures import ThreadPoolExecutor
import time,datetime
L1=[1,2,3,4,5,6,7,8,9,10]
L2=[1,2,3,4,5,6,7,8,9,10]
def add(a,b):print("============程序开始时间=============={}".format(datetime.datetime.now()))time.sleep(1)return a+bif __name__=='__main__':with ThreadPoolExecutor(5) as t:res=t.map(add,L1,L2)print(res,type(res),list(res))print("============程序结束=============={}".format(datetime.datetime.now()))
返回结果:
============程序开始时间==============2022-07-08 10:48:45.342660
============程序开始时间==============2022-07-08 10:48:45.342957
============程序开始时间==============2022-07-08 10:48:45.343087
============程序开始时间==============2022-07-08 10:48:45.343184
============程序开始时间==============2022-07-08 10:48:45.343466
============程序开始时间==============2022-07-08 10:48:46.344016
============程序开始时间==============2022-07-08 10:48:46.344077
============程序开始时间==============2022-07-08 10:48:46.344096
============程序开始时间==============2022-07-08 10:48:46.344114
============程序开始时间==============2022-07-08 10:48:46.344211
<generator object Executor.map.<locals>.result_iterator at 0x7f99ae76df90> <class 'generator'> [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
============程序结束==============2022-07-08 10:48:47.345554
这个map返回的结果集是根据执行顺序来的,为社么这么说,我们改写代码:
from concurrent.futures import ThreadPoolExecutor
import time,datetime
L1=[1,2,3,4,5,6,7,8,9,10]
L2=[1,2,3,4,5,6,7,8,9,10]
def add(a,b):print("============程序开始时间=============={}这是第{}个线程".format(datetime.datetime.now(),a))time.sleep(a%2)print("============程序结束时间=============={}这是第{}个线程".format(datetime.datetime.now(), a))return a+b
# def fn(res):
# print(res.result())
# return res.result()if __name__=='__main__':with ThreadPoolExecutor(5) as t:res=t.map(add,L1,L2)print(res,type(res),list(res))print("============主程序结束=============={}".format(datetime.datetime.now()))
运行结果:
============程序开始时间==============2022-07-08 11:04:00.576773这是第1个线程
============程序开始时间==============2022-07-08 11:04:00.576998这是第2个线程
============程序结束时间==============2022-07-08 11:04:00.577011这是第2个线程
============程序开始时间==============2022-07-08 11:04:00.577155这是第3个线程
============程序开始时间==============2022-07-08 11:04:00.577264这是第4个线程
============程序结束时间==============2022-07-08 11:04:00.577276这是第4个线程
============程序开始时间==============2022-07-08 11:04:00.577360这是第5个线程
============程序开始时间==============2022-07-08 11:04:00.577479这是第6个线程
============程序结束时间==============2022-07-08 11:04:00.577490这是第6个线程
============程序开始时间==============2022-07-08 11:04:00.577574这是第7个线程
============程序开始时间==============2022-07-08 11:04:00.577703这是第8个线程
============程序结束时间==============2022-07-08 11:04:00.577714这是第8个线程
============程序开始时间==============2022-07-08 11:04:00.577776这是第9个线程
============程序结束时间==============2022-07-08 11:04:01.578215这是第1个线程
============程序开始时间==============2022-07-08 11:04:01.578312这是第10个线程
============程序结束时间==============2022-07-08 11:04:01.578322这是第10个线程
============程序结束时间==============2022-07-08 11:04:01.578513这是第3个线程
============程序结束时间==============2022-07-08 11:04:01.578551这是第5个线程
============程序结束时间==============2022-07-08 11:04:01.578581这是第7个线程
============程序结束时间==============2022-07-08 11:04:01.578697这是第9个线程
<generator object Executor.map.<locals>.result_iterator at 0x7f32e0394f20> <class 'generator'> [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
============主程序结束==============2022-07-08 11:04:01.578848
返回结果依旧是根据线程的顺序来的,很好
返回结果调用第二种方式:
from concurrent.futures import ThreadPoolExecutor
import time,datetime
L1=[1,2,3,4,5,6,7,8,9,10]
L2=[1,2,3,4,5,6,7,8,9,10]
def add(a,b):print("============程序开始时间=============={}这是第{}个线程".format(datetime.datetime.now(),a))time.sleep(a%2)print("============程序结束时间=============={}这是第{}个线程".format(datetime.datetime.now(), a))return a+b
def fn(res):print(res.result())return res.result()if __name__=='__main__':result=[]with ThreadPoolExecutor(5) as t:for p in list(zip(L1,L2)):result.append(t.submit(lambda p:add(*p),p).add_done_callback(fn))print(result)print("============主程序结束=============={}".format(datetime.datetime.now()))
执行结果:
============程序开始时间==============2022-07-08 12:02:07.713207这是第1个线程
============程序开始时间==============2022-07-08 12:02:07.713511这是第2个线程
============程序结束时间==============2022-07-08 12:02:07.713525这是第2个线程
4
============程序开始时间==============2022-07-08 12:02:07.713625这是第3个线程
============程序开始时间==============2022-07-08 12:02:07.713739这是第4个线程
============程序结束时间==============2022-07-08 12:02:07.713751这是第4个线程
8
============程序开始时间==============2022-07-08 12:02:07.713844这是第5个线程
============程序开始时间==============2022-07-08 12:02:07.713927这是第6个线程
============程序结束时间==============2022-07-08 12:02:07.713974这是第6个线程
12
============程序开始时间==============2022-07-08 12:02:07.714068这是第7个线程
============程序开始时间==============2022-07-08 12:02:07.714195这是第8个线程
============程序结束时间==============2022-07-08 12:02:07.714206这是第8个线程
16
============程序开始时间==============2022-07-08 12:02:07.714277这是第9个线程
============程序结束时间==============2022-07-08 12:02:08.714232这是第1个线程
2
============程序开始时间==============2022-07-08 12:02:08.714339这是第10个线程
============程序结束时间==============2022-07-08 12:02:08.714350这是第10个线程
20
============程序结束时间==============2022-07-08 12:02:08.714556这是第3个线程
6
============程序结束时间==============2022-07-08 12:02:08.714605这是第5个线程
10
============程序结束时间==============2022-07-08 12:02:08.714646这是第7个线程
14
============程序结束时间==============2022-07-08 12:02:08.714819这是第9个线程
18
[None, None, None, None, None, None, None, None, None, None]
============主程序结束==============2022-07-08 12:02:08.714934
这个先后执行顺序不做保证,和Thread类似
本案例add使用了两个变量,迭代的时候需要使用lambda函数,然后在通过可变变量*的方式传入值,很神奇这种方法
返回结果调用第三种方法:
from concurrent.futures import ThreadPoolExecutor
import time,datetime
L1=[1,2,3,4,5,6,7,8,9,10]
L2=[1,2,3,4,5,6,7,8,9,10]
def add(a,b):print("============程序开始时间=============={}这是第{}个线程".format(datetime.datetime.now(),a))time.sleep(a%2)print("============程序结束时间=============={}这是第{}个线程".format(datetime.datetime.now(), a))return a+b
if __name__=='__main__':result=[]with ThreadPoolExecutor(5) as t:for p in list(zip(L1,L2)):result.append(t.submit(lambda p:add(*p),p))for i in result:print(i.result())print("============主程序结束=============={}".format(datetime.datetime.now()))
执行
============程序开始时间==============2022-07-08 12:59:50.259288这是第1个线程
============程序开始时间==============2022-07-08 12:59:50.259593这是第2个线程
============程序结束时间==============2022-07-08 12:59:50.259608这是第2个线程
============程序开始时间==============2022-07-08 12:59:50.259704这是第3个线程
============程序开始时间==============2022-07-08 12:59:50.259787这是第4个线程
============程序结束时间==============2022-07-08 12:59:50.259837这是第4个线程
============程序开始时间==============2022-07-08 12:59:50.259929这是第5个线程
============程序开始时间==============2022-07-08 12:59:50.260012这是第6个线程
============程序结束时间==============2022-07-08 12:59:50.260023这是第6个线程
============程序开始时间==============2022-07-08 12:59:50.260146这是第7个线程
============程序开始时间==============2022-07-08 12:59:50.260258这是第8个线程
============程序结束时间==============2022-07-08 12:59:50.260270这是第8个线程
============程序开始时间==============2022-07-08 12:59:50.260407这是第9个线程
============程序结束时间==============2022-07-08 12:59:51.260545这是第1个线程
============程序开始时间==============2022-07-08 12:59:51.260651这是第10个线程
============程序结束时间==============2022-07-08 12:59:51.260664这是第10个线程
============程序结束时间==============2022-07-08 12:59:51.260868这是第3个线程
============程序结束时间==============2022-07-08 12:59:51.260912这是第5个线程
============程序结束时间==============2022-07-08 12:59:51.260945这是第7个线程
============程序结束时间==============2022-07-08 12:59:51.261080这是第9个线程
2
4
6
8
10
12
14
16
18
20
============主程序结束==============2022-07-08 12:59:51.261224
使用了with方法默认要等线程执行完毕才能运行最下面的主程序结束
代码在改变下
from concurrent.futures import ThreadPoolExecutor
import time,datetime
L1=[1,2,3,4,5,6,7,8,9,10]
L2=[1,2,3,4,5,6,7,8,9,10]
def add(a,b):print("============程序开始时间=============={}这是第{}个线程".format(datetime.datetime.now(),a))time.sleep(a%2)print("============程序结束时间=============={}这是第{}个线程".format(datetime.datetime.now(), a))return a+b
def fn(res):print(res.result())return res.result()if __name__=='__main__':# with ThreadPoolExecutor(5) as t:# res=t.map(add,L1,L2)# print(res,type(res),list(res))# print("============主程序结束=============={}".format(datetime.datetime.now()))result=[]# with ThreadPoolExecutor(5) as t:# for p in list(zip(L1,L2)):# result.append(t.submit(lambda p:add(*p),p).add_done_callback(fn))# print(result)t=ThreadPoolExecutor(max_workers=5)for p in list(zip(L1, L2)):result.append(t.submit(lambda p:add(*p),p).add_done_callback(fn))# t.shutdown()print("============主程序结束=============={}".format(datetime.datetime.now()))
运行结果
============程序开始时间==============2022-07-08 12:15:02.978244这是第1个线程
============程序开始时间==============2022-07-08 12:15:02.978540这是第2个线程
============程序结束时间==============2022-07-08 12:15:02.978554这是第2个线程
4
============程序开始时间==============2022-07-08 12:15:02.978653这是第3个线程
============程序开始时间==============2022-07-08 12:15:02.978771这是第4个线程
============程序结束时间==============2022-07-08 12:15:02.978784这是第4个线程
8
============程序开始时间==============2022-07-08 12:15:02.978877这是第5个线程
============程序开始时间==============2022-07-08 12:15:02.978991这是第6个线程
============程序结束时间==============2022-07-08 12:15:02.979003这是第6个线程
12
============程序开始时间==============2022-07-08 12:15:02.979094这是第7个线程
============程序开始时间==============2022-07-08 12:15:02.979204这是第8个线程
============程序结束时间==============2022-07-08 12:15:02.979216这是第8个线程
16
============主程序结束==============2022-07-08 12:15:02.979256
============程序开始时间==============2022-07-08 12:15:02.979309这是第9个线程
============程序结束时间==============2022-07-08 12:15:03.979889这是第1个线程
2
============程序开始时间==============2022-07-08 12:15:03.980001这是第10个线程
============程序结束时间==============2022-07-08 12:15:03.980013这是第10个线程
20
============程序结束时间==============2022-07-08 12:15:03.980232这是第3个线程
6
============程序结束时间==============2022-07-08 12:15:03.980283这是第5个线程
10
============程序结束时间==============2022-07-08 12:15:03.980326这是第7个线程
14
============程序结束时间==============2022-07-08 12:15:03.980469这是第9个线程
18
注意下主程序结束==2022-07-08 12:15:02.979256 这个没有等线程结束就执行了,和只有start()没有join的一样,这种方式等着结束,需要这样写
from concurrent.futures import ThreadPoolExecutor
import time,datetime
L1=[1,2,3,4,5,6,7,8,9,10]
L2=[1,2,3,4,5,6,7,8,9,10]
def add(a,b):print("============程序开始时间=============={}这是第{}个线程".format(datetime.datetime.now(),a))time.sleep(a%2)print("============程序结束时间=============={}这是第{}个线程".format(datetime.datetime.now(), a))return a+b
def fn(res):print(res.result())return res.result()if __name__=='__main__':# with ThreadPoolExecutor(5) as t:# res=t.map(add,L1,L2)# print(res,type(res),list(res))# print("============主程序结束=============={}".format(datetime.datetime.now()))result=[]# with ThreadPoolExecutor(5) as t:# for p in list(zip(L1,L2)):# result.append(t.submit(lambda p:add(*p),p).add_done_callback(fn))# print(result)t=ThreadPoolExecutor(max_workers=5)for p in list(zip(L1, L2)):result.append(t.submit(lambda p:add(*p),p).add_done_callback(fn))t.shutdown()print("============主程序结束=============={}".format(datetime.datetime.now()))
运行结果
from concurrent.futures import ThreadPoolExecutor
import time,datetime
L1=[1,2,3,4,5,6,7,8,9,10]
L2=[1,2,3,4,5,6,7,8,9,10]
def add(a,b):print("============程序开始时间=============={}这是第{}个线程".format(datetime.datetime.now(),a))time.sleep(a%2)print("============程序结束时间=============={}这是第{}个线程".format(datetime.datetime.now(), a))return a+b
def fn(res):print(res.result())return res.result()if __name__=='__main__':# with ThreadPoolExecutor(5) as t:# res=t.map(add,L1,L2)# print(res,type(res),list(res))# print("============主程序结束=============={}".format(datetime.datetime.now()))result=[]# with ThreadPoolExecutor(5) as t:# for p in list(zip(L1,L2)):# result.append(t.submit(lambda p:add(*p),p).add_done_callback(fn))# print(result)t=ThreadPoolExecutor(max_workers=5)for p in list(zip(L1, L2)):result.append(t.submit(lambda p:add(*p),p).add_done_callback(fn))t.shutdown()print("============主程序结束=============={}".format(datetime.datetime.now()))
python 线程池调用返回结果处理相关推荐
- Python 线程池 ThreadPoolExecutor(一) - Python零基础入门教程
目录 一.Python 线程池前言 二.Python 线程池原理 三.Python 线程池 ThreadPoolExecutor 函数介绍 四.Python 线程池 ThreadPoolExecuto ...
- python线程池原理及使用
python线程池及其原理和使用 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑 ...
- Python线程池与进程池
Python线程池与进程池 前言 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识 ...
- 浅谈python线程池
python线程池的使用 python的多线程管理一直很麻烦,可能是我基础不够好,这里记录并分享以下python的线程池管理 在网上查了一个线程池的使用资料,个人感觉不是很清晰 但是重点很到位, 原文 ...
- Python 线程池 ThreadPoolExecutor(二) - Python零基础入门教程
目录 一.Python 线程池前言 二.Python 线程池 ThreadPoolExecutor 常用函数 1.线程池 as_completed 函数使用 2.线程池 map 函数使用 3.线程池 ...
- python线程池(threadpool)模块使用笔记详解
这篇文章主要介绍了python线程池(threadpool)模块使用笔记详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 最近在做一个视频设备管理的项目,设备包括(摄像 ...
- python线程池使用和问题记录
记录一次使用多线程的问题 背景 最近工作有个需求根据文件中的数据请求中台服务,然后解析返回值.文件中每行代表一个参数,使用post方式携带参数请求中台接口. 分析:需要处理的数据量非常大(近200w行 ...
- python线程池wait_python线程池 ThreadPoolExecutor 的用法示例
前言 从Python3.2开始,标准库为我们提供了 concurrent.futures 模块,它提供了 ThreadPoolExecutor (线程池)和ProcessPoolExecutor (进 ...
- python 线程池 concurrent.futures ThreadPoolExecutor
python 线程池 concurrent.futures ThreadPoolExecutor 步骤: 1,导包from concurrent.futures import ThreadPoolEx ...
最新文章
- 仅需6步,教你轻易撕掉app开发框架的神秘面纱(5):数据持久化
- 原创 | 比新基建还火,数字孪生究竟有哪些应用价值?
- 这就是程序员被大厂偏爱的实力!
- cw2vec:蚂蚁金服公开最新基于笔画的中文词向量算法
- 再论《IT人员应聘建议》
- 诸子经典 —— 《管子》
- 4. CSS id 选择器
- Linux firefox2.0自动升级后启动不了
- latex中嵌入视频文件
- Visio安装网盘,我不会破解
- 如何在Cesium中加载谷歌离线影像数据
- UWP 写入图片 Exif 信息
- 智能卡卡发卡流程(收藏3)
- 包络线公式如何用计算机求,包络线公式(图表控件)
- 【超级表格创业谱】王庆刚:你的岗位有没有辜负你的才华?
- Maya cmds pymel 单位和轴向设置
- 螃蟹芯片RTL8762之修改蓝牙设备类型
- spring用注解无法灵活注入带参构造函数解决办法
- springboot多数据源配置导致mybatis的下划线转驼峰命名不起作用
- java 获取resource底下文件的字符内容
热门文章
- c语言getline作用,C/C++中常用的getline函数
- vue/js实现文件流下载,文件下载进度监听
- 《水运仪象志》-摘录
- yahoo助手_安利一款日本人常用的换乘助手app
- Java Bean解析。什么是Javabean?
- JJWT 实现JWT
- ETHBMC: A Bounded Model Checker for Smart Contracts
- 【备战面试】面试题打卡——Mysql相关面试题总结
- np.multiply()、np.dot()和(*)简要介绍
- 俞敏洪郑大演讲经典语句