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 线程池调用返回结果处理相关推荐

  1. Python 线程池 ThreadPoolExecutor(一) - Python零基础入门教程

    目录 一.Python 线程池前言 二.Python 线程池原理 三.Python 线程池 ThreadPoolExecutor 函数介绍 四.Python 线程池 ThreadPoolExecuto ...

  2. python线程池原理及使用

    python线程池及其原理和使用 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很好地提升性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑 ...

  3. Python线程池与进程池

    Python线程池与进程池 前言 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手. 很多已经做案例的人,却不知道如何去学习更加高深的知识 ...

  4. 浅谈python线程池

    python线程池的使用 python的多线程管理一直很麻烦,可能是我基础不够好,这里记录并分享以下python的线程池管理 在网上查了一个线程池的使用资料,个人感觉不是很清晰 但是重点很到位, 原文 ...

  5. Python 线程池 ThreadPoolExecutor(二) - Python零基础入门教程

    目录 一.Python 线程池前言 二.Python 线程池 ThreadPoolExecutor 常用函数 1.线程池 as_completed 函数使用 2.线程池 map 函数使用 3.线程池 ...

  6. python线程池(threadpool)模块使用笔记详解

    这篇文章主要介绍了python线程池(threadpool)模块使用笔记详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 最近在做一个视频设备管理的项目,设备包括(摄像 ...

  7. python线程池使用和问题记录

    记录一次使用多线程的问题 背景 最近工作有个需求根据文件中的数据请求中台服务,然后解析返回值.文件中每行代表一个参数,使用post方式携带参数请求中台接口. 分析:需要处理的数据量非常大(近200w行 ...

  8. python线程池wait_python线程池 ThreadPoolExecutor 的用法示例

    前言 从Python3.2开始,标准库为我们提供了 concurrent.futures 模块,它提供了 ThreadPoolExecutor (线程池)和ProcessPoolExecutor (进 ...

  9. python 线程池 concurrent.futures ThreadPoolExecutor

    python 线程池 concurrent.futures ThreadPoolExecutor 步骤: 1,导包from concurrent.futures import ThreadPoolEx ...

最新文章

  1. 仅需6步,教你轻易撕掉app开发框架的神秘面纱(5):数据持久化
  2. 原创 | 比新基建还火,数字孪生究竟有哪些应用价值?
  3. 这就是程序员被大厂偏爱的实力!
  4. cw2vec:蚂蚁金服公开最新基于笔画的中文词向量算法
  5. 再论《IT人员应聘建议》
  6. 诸子经典 —— 《管子》
  7. 4. CSS id 选择器
  8. Linux firefox2.0自动升级后启动不了
  9. latex中嵌入视频文件
  10. Visio安装网盘,我不会破解
  11. 如何在Cesium中加载谷歌离线影像数据
  12. UWP 写入图片 Exif 信息
  13. 智能卡卡发卡流程(收藏3)
  14. 包络线公式如何用计算机求,包络线公式(图表控件)
  15. 【超级表格创业谱】王庆刚:你的岗位有没有辜负你的才华?
  16. Maya cmds pymel 单位和轴向设置
  17. 螃蟹芯片RTL8762之修改蓝牙设备类型
  18. spring用注解无法灵活注入带参构造函数解决办法
  19. springboot多数据源配置导致mybatis的下划线转驼峰命名不起作用
  20. java 获取resource底下文件的字符内容

热门文章

  1. c语言getline作用,C/C++中常用的getline函数
  2. vue/js实现文件流下载,文件下载进度监听
  3. 《水运仪象志》-摘录
  4. yahoo助手_安利一款日本人常用的换乘助手app
  5. Java Bean解析。什么是Javabean?
  6. JJWT 实现JWT
  7. ETHBMC: A Bounded Model Checker for Smart Contracts
  8. 【备战面试】面试题打卡——Mysql相关面试题总结
  9. np.multiply()、np.dot()和(*)简要介绍
  10. 俞敏洪郑大演讲经典语句