线程池的两张方法 submit 和map

from concurrent.futures import ThreadPoolExecutor
import time # def sayhello(a):
time.sleep(2)
return "hello: "+a def main():
seed = ["a","b","c"]
# 不使用线程
start1 = time.time()
for each in seed:
t1 = sayhello(each)
print(t1)
end1 = time.time()
print("time1: "+str(end1-start1))
print('------------------submit----------------------')
# 线程池submit用法
# 1.先把值存放在列表中
# 2.在遍历列表取返回值
# 3.将遍历获取的结果存放在列表中
start2 = time.time()
lst = []
result_lst = []
with ThreadPoolExecutor(3) as executor:
for each in seed:
t2 = executor.submit(sayhello, each)
lst.append(t2)
for i in lst:
print(i.result())
result_lst.append(i.result())
print(result_lst)
end2 = time.time()
print("time2: "+str(end2-start2)) print('---------------map----------------------')
# 线程池map的用法
# map的参数:迭代器
# map的返回值是:生成器
# 1、获取生成器(或直接使用list强制装换)
# 2、遍历取值
# 3、将遍历的结果放入新的列表
map_lst = []
start3 = time.time()
with ThreadPoolExecutor(3) as executor1:
t3 = executor1.map(sayhello, seed)
for t in t3:
map_lst.append(t)
print(map_lst)
end3 = time.time()
print("time3: "+str(end3-start3)) if __name__ == '__main__':
main()

other

from concurrent.futures import ThreadPoolExecutor
import time # def sayhello(a):
time.sleep(2)
foo = [1, a]
return foo def main():
seed = ["a","b","c"]
# 不使用线程
start1 = time.time()
for each in seed:
t1 = sayhello(each)
print(t1)
end1 = time.time()
print("time1: "+str(end1-start1)) print('---------------map----------------------')
# 线程池map的用法
# map 的结果是迭代器,使用for循环取值
map_lst = []
start3 = time.time()
with ThreadPoolExecutor(3) as executor1:
t3 = executor1.map(sayhello, seed)
for t in t3:
map_lst.extend(t)
print(map_lst)
end3 = time.time()
print("time3: "+str(end3-start3)) if __name__ == '__main__':
main()

区别

map:
1、提交的任务的函数是一样的
2、参数:只需要提交一次目标函数,目标函数的参数放在一个迭代器(列表,字典)
submit:
1、提交的任务函数是不一样的,或者执行的过程之可能出现异常(使用map执行过程中发现问题会直接抛出错误)
2、参数:submit每次都需要提交一个目标函数和对应的参数 结果:
map可以保证输出的顺序, submit输出的顺序是乱的

python 线程池实用总结的更多相关文章

  1. 自定义高级版python线程池

    基于简单版创建类对象过多,现自定义高级版python线程池,代码如下 #高级线程池 import queue import threading import time StopEvent = obje ...

  2. 对Python线程池

    本文对Python线程池进行详细说明介绍,IDE选择及编码的解决方案进行了一番详细的描述,实为Python初学者必读的Python学习经验心得. AD: 干货来了,不要等!WOT2015 北京站演讲P ...

  3. Python 线程池(小节)

    Python 线程池(小节) from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import os,time, ...

  4. python线程池ThreadPoolExecutor(上)(38)

    在前面的文章中我们已经介绍了很多关于python线程相关的知识点,比如 线程互斥锁Lock / 线程事件Event / 线程条件变量Condition 等等,而今天给大家讲解的是 线程池ThreadP ...

  5. python线程池及其原理和使用

    python线程池及其原理和使用 2019-05-29 17:05:20 whatday 阅读数 576 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很 ...

  6. python线程池示例

    使用with方式创建线程池,任务执行完毕之后,会自动关闭资源 , 否则就需要手动关闭线程池资源  import threading, time from concurrent.futures impo ...

  7. Python线程池与进程池

    Python线程池与进程池 前言 前面我们已经将线程并发编程与进程并行编程全部摸了个透,其实我第一次学习他们的时候感觉非常困难甚至是吃力.因为概念实在是太多了,各种锁,数据共享同步,各种方法等等让人十 ...

  8. python线程池实现

    python 的线程池主要有threadpool,不过它并不是内置的库,每次使用都需要安装,而且使用起来也不是那么好用,所以自己写了一个线程池实现,每次需要使用直接import即可.其中还可以根据传入 ...

  9. 《转》python线程池

    线程池的概念是什么? 在IBM文档库中这样的一段描写:“在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是 如此,虚拟机将试图跟踪每一个对象 ...

随机推荐

  1. 【js】 vue 2.5.1 源码学习(六) initProxy initLifeCycle 渲染函数的作用域代理

    大体思路 (五) 1. initProxy 渲染函数的作用域代理 ==> es6 如果支持proxy (hasProxy) 就用proxy 不支持就用 defineProperty() prox ...

  2. 2018-2-13-win10-uwp-InkCanvas控件数据绑定

    title author date CreateTime categories win10 uwp InkCanvas控件数据绑定 lindexi 2018-2-13 17:23:3 +0800 20 ...

  3. 【js】vue 2.5.1 源码学习 (四) 钩子函数 资源选项 watch 的合并策略

    大体思路 (三)    1.钩子函数 自定义策略       LIFECYCLE_HOOKS= []      created = [function(){} , function(){}] 组装方法 ...

  4. C# 简单读取文件

    本文告诉大家如何使用最少的代码把一个文件读取二进制,读取为字符串 现在写了一些代码,想使用最少代码来写简单的读文件,所以我就写了这个文章 读取文件为二进制 private byte[] ReadFil ...

  5. Apply,Call,bind对比

    apply.call call和apply都是为了改变上下文背景存在的,即改变函数内部指向 javascript一大特点是函数存在定义时的上下文,运行时的上下文和上下文可改变的概念 apply.cal ...

  6. 2018-2-13-win10-uwp-csdn-博客阅读器

    title author date CreateTime categories win10 uwp csdn 博客阅读器 lindexi 2018-2-13 17:23:3 +0800 2018-2- ...

  7. HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分)

    HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分) 传送门:http://acm.hdu.edu.cn/showproblem.php? ...

  8. Oracle Net Manager 的使用方法(监听的配置方法)

    一,在服务端配置oracle端口 win+R  输入netca 弹出如下窗口后 选择监听程序配置,点击下一步 二.配置端口后使用Telnet工具调试端口是否联通 在命令行输入telnet 服务器ip ...

  9. MFC_对话框_访问控件_7种方法_A

    访问对话框控件的七种方法 方法一. GetDlgItem()->GetWindowText(); GetDlgItem()->SetWindowText(); 方法二. GetDlgIte ...

  10. 泛型的运用(用于查询数据后DataTable转实体类)

    2019.8.14 更新 补全了DataTable转泛型集合的方法: /// <summary> /// DataTable转实体类集合 /// </summary> /// ...