concurrent包只有一个模块:

concurrent.futures - 启动并行任务

异步并行任务编程模块,提供一个高级的异步可执行的便利接口。

futures模块提供了2个池执行器

ThreadPoolExecutor 异步调用的线程池的Executor

ProcessPoolExecutor 异步调用的进程池的Executor

ThreadPoolExecutor对象

首先需要定义一个池的执行器对象,Executor类子类对象。

ThreadPoolExecutor(max_worker=1)     池中至多创建max_workers个线程的池来同时异步执行,返回Executor实例

submit(fn,*args,**kwargs)    提交执行的函数即参数,返回Future实例

shutdown(wait=True)    清理池

Future类方法:

result()    可以查看调用的返回的结果

done()     如果调用被成功的取消或者执行完成,返回True

canceled()    如果调用被成功的取消,返回True

running()     如果正在运行且不能被取消,返回True

cancel()     尝试取消调用。如果已经执行且不能取消返回False,否则返回True

result(timeout=None)   取返回的结果,超时为None,一直等待返回;超时设置到期,抛出concurrent.futures.TimeoutError异常

execption(timeout=None)   取返回的异常,超时为None,一直等待返回;超时设置到期,抛出conncurrent.futures.TimeoutError异常

1) 线程池并行异步执行:

# 并行异步执行,线程 ThreadPoolExecutor

import threading
import logging
from concurrent import futures
import time
logging.basicConfig(level=logging.INFO,format="%(thread)s %(message)s") def work(n): #工作函数
logging.info('wokring-{}'.format(n))
time.sleep(5)
logging.info('end work-{}'.format(n)) executor = futures.ThreadPoolExecutor(3) #线程 fs = [] #线程池容器 for i in range(3):
f = executor.submit(work,i) #提交执行的函数及参数
fs.append(f) for i in range(3,6):
f = executor.submit(work,i)
fs.append(f) while True:
time.sleep(2)
logging.info(threading.enumerate()) flag = True for f in fs:
flag = flag and f.done() #调用是否被成功的取消或运行完成 if flag:
executor.shutdown() #清理池
logging.info(threading.enumerate())
break #运行结果:
123145331777536 wokring-0
123145337032704 wokring-1
123145342287872 wokring-2
4320629568 [<_MainThread(MainThread, started 4320629568)>, <Thread(Thread-1, started daemon 123145331777536)>, <Thread(Thread-2, started daemon 123145337032704)>, <Thread(Thread-3, started daemon 123145342287872)>]
4320629568 [<_MainThread(MainThread, started 4320629568)>, <Thread(Thread-1, started daemon 123145331777536)>, <Thread(Thread-2, started daemon 123145337032704)>, <Thread(Thread-3, started daemon 123145342287872)>]
123145331777536 end work-0
123145331777536 wokring-3
123145337032704 end work-1
123145337032704 wokring-4
123145342287872 end work-2
123145342287872 wokring-5
4320629568 [<_MainThread(MainThread, started 4320629568)>, <Thread(Thread-1, started daemon 123145331777536)>, <Thread(Thread-2, started daemon 123145337032704)>, <Thread(Thread-3, started daemon 123145342287872)>]
4320629568 [<_MainThread(MainThread, started 4320629568)>, <Thread(Thread-1, started daemon 123145331777536)>, <Thread(Thread-2, started daemon 123145337032704)>, <Thread(Thread-3, started daemon 123145342287872)>]
123145331777536 end work-3
123145342287872 end work-5
123145337032704 end work-4
4320629568 [<_MainThread(MainThread, started 4320629568)>, <Thread(Thread-1, started daemon 123145331777536)>, <Thread(Thread-2, started daemon 123145337032704)>, <Thread(Thread-3, started daemon 123145342287872)>]
4320629568 [<_MainThread(MainThread, started 4320629568)>]

  

2) 进程池并行异步执行:

import threading #ProcessPoolExecutor进程池
import logging
from concurrent import futures
import time
logging.basicConfig(level=logging.INFO,format="%(thread)s %(message)s") def work(n):
logging.info('wokring-{}'.format(n))
time.sleep(5)
logging.info('end work-{}'.format(n)) if __name__ == "__main__":
executor = futures.ProcessPoolExecutor(3) #进程 fs = [] for i in range(3):
f = executor.submit(work,i)
fs.append(f) for i in range(3,6):
f = executor.submit(work,i)
fs.append(f) while True:
time.sleep(2)
logging.info(threading.enumerate()) flag = True for f in fs: flag = flag and f.done() if flag:
executor.shutdown()
logging.info(threading.enumerate())
break #运行结果:
4320629568 wokring-1
4320629568 wokring-2
4320629568 wokring-0
4320629568 [<_MainThread(MainThread, started 4320629568)>, <Thread(Thread-1, started daemon 123145319972864)>, <Thread(QueueFeederThread, started daemon 123145325228032)>]
4320629568 [<_MainThread(MainThread, started 4320629568)>, <Thread(Thread-1, started daemon 123145319972864)>, <Thread(QueueFeederThread, started daemon 123145325228032)>]
4320629568 end work-0
4320629568 end work-1
4320629568 end work-2
4320629568 wokring-3
4320629568 wokring-4
4320629568 wokring-5
4320629568 [<_MainThread(MainThread, started 4320629568)>, <Thread(Thread-1, started daemon 123145319972864)>, <Thread(QueueFeederThread, started daemon 123145325228032)>]
4320629568 [<_MainThread(MainThread, started 4320629568)>, <Thread(Thread-1, started daemon 123145319972864)>, <Thread(QueueFeederThread, started daemon 123145325228032)>]
4320629568 end work-3
4320629568 end work-4
4320629568 end work-5
4320629568 [<_MainThread(MainThread, started 4320629568)>, <Thread(Thread-1, started daemon 123145319972864)>, <Thread(QueueFeederThread, started daemon 123145325228032)>]
4320629568 [<_MainThread(MainThread, started 4320629568)>]

  

支持上下文管理

concurrent.futures.ProcessPoolExecutor继承自conncurrent.futures.base.Executor,而父类有__enter__、__exit__方法,支持上下文管理。可以使用with语句

with ThreadPoolExecutor(max_workers=5) as executor:
future = executor.submit(work,n)
print(future.result())

  

总结:

统一了线程池、进程池调用,简化了编程。

是Python简单的思想哲学的体现。

唯一的缺点:无法设置线程名称。

[Python 多线程] Concurrent (十五)的更多相关文章

  1. Python进阶(三十五)-Fiddler命令行和HTTP断点调试

    Python进阶(三十五)-Fiddler命令行和HTTP断点调试 一. Fiddler内置命令   上一节(使用Fiddler进行抓包分析)中,介绍到,在web session(与我们通常所说的se ...

  2. “全栈2019”Java多线程第二十五章:生产者与消费者线程详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  3. “全栈2019”Java多线程第十五章:当后台线程遇到finally

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. 孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1

    孤荷凌寒自学python第八十五天配置selenium并进行模拟浏览器操作1 (完整学习过程屏幕记录视频地址在文末) 要模拟进行浏览器操作,只用requests是不行的,因此今天了解到有专门的解决方案 ...

  5. 孤荷凌寒自学python第七十五天开始写Python的第一个爬虫5

    孤荷凌寒自学python第七十五天开始写Python的第一个爬虫5 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 直接上代码.详细过程见文末屏幕录像 ...

  6. 孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4

    孤荷凌寒自学python第六十五天学习mongoDB的基本操作并进行简单封装4 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十一天. 今天继续学习mongoDB的简单操作 ...

  7. 孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备

     孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天本来应当继续学习Python的数据库操作,但根据过去我自 ...

  8. 孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容

     孤荷凌寒自学python第三十五天python的文件操作之针对文件操作的os模块的相关内容 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.打开文件后,要务必记得关闭,所以一般的写法应当 ...

  9. 进击的Python【第十五章】:Web前端基础之DOM

    进击的Python[第十五章]:Web前端基础之DOM 简介:文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示 ...

随机推荐

  1. android 模拟器无法启动问题

    很早之前就碰到过Android Studio模拟器无法启动的问题,今天终于尝试去解决了下,下面将我解决的方法记录下. 模拟器报错信息为: emulator: ERROR: x86 emulation ...

  2. spring与dwr整合实现js直接使用java代码

    此文章是基于 搭建Jquery+SpringMVC+Spring+Hibernate+MySQL平台 一. jar包介绍 1. dwr-3.0.1.jar,支持 spring 4.3.4 的最低版本 ...

  3. hdu 2049 考新郎

    假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能. 和之前那道题一样,是错排,但是要乘上排列数. 选对的人有C(N,M)个组合,将它们排除掉,剩下的人就是错排了 #in ...

  4. python_Django 实现登入功能form表单的参数接收处理

    1.创建Django工程. 参考https://www.cnblogs.com/CK85/p/10159159.html中步骤. 2.在urls.py文件中添加url分发路径 "" ...

  5. CodeChef SADPAIRS:Chef and Sad Pairs

    vjudge 首先显然要建立圆方树 对于每一种点建立虚树,考虑这一种点贡献,对于虚树上已经有的点就直接算 否则对虚树上的一条边 \((u, v)\),\(u\) 为父亲,假设上面连通块大小为 \(x\ ...

  6. bzoj P3884 上帝与集合的正确用法

    Description   根据一些书上的记载,上帝的一次失败的创世经历是这样的: 第一天, 上帝创造了一个世界的基本元素,称做“元”. 第二天, 上帝创造了一个新的元素,称作“α”.“α”被定义为“ ...

  7. react与vue

    vue的选择居于react与angular之间,框架自身的语法比react多一点,但是又比angular少一点. 也正是由于选择的不同,所呈现出来的写法与思考方式就一定会有所差异,不论优劣,但肯定会导 ...

  8. layui-open-上传文件

    <!--选择文件上传--> <script id="upload_file_dialog" type="text/html"> < ...

  9. Google APAC----Africa 2010, Qualification Round(Problem A. Store Credit)----Perl 解法

    原题地址链接:https://code.google.com/codejam/contest/351101/dashboard#s=p0 问题描述: Problem You receive a cre ...

  10. 路飞学城知识点4之Django contenttypes 应用

    Django contenttypes 应用 contenttypes 是Django内置的一个应用,可以追踪项目中所有app和model的对应关系,并记录在ContentType表中. 每当我们创建 ...