concurrent包

concurrent.futrues模块

3.2版本引入

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

提供了两个池执行器

ThreadPoolExecutor异步调用的线程池的Executor

ProcessPoolExecutor异步调用的进程池的Executor

ThreadPoolExecutor对象

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

方法 含义
ThreadPoolExecutor(max_workers= 1) 池中最多创建max_workers个线程的池类同时异步执行,返回Executor实例
submit(fn,*args,**kwargs) 异步提交执行的函数及其参数,返回Future实例
shutdown(wait = True) 清理池
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
import time # ProcessPoolExecutor(5) # 5代表只能开启5个进程
# ProcessPoolExecutor() # 默认以CPU的个数限制进程数 pool = ThreadPoolExecutor(5) # 5代表只能开启5个线程
# ThreadPoolExecutor() # 默认以CPU个数 * 5 限制线程数 # t = Tread() # 异步提交
# t.start(0)

Future类

方法 含义
result(timeout=None) 可以查看调用函数的返回值结果,tiime未none,一直等待返回;timeout设置到期,抛出concurrent.futures.TimeError异常
done() 如果调用被成功的取消或者执行完成,返回True
cancelled() 如果调用被成功的取消,返回True
result() 如果正在运行且不能被取消,返回True
cancel() 尝试取消调用,如果已经执行且不能取消放回false;否则返回True
exception(timeout= None) 取返回的异常,timeout为None,一直等待返回;timeout设置到期,抛出concurrent.futures.TimeoutError异常
#pip3 install gevent
from gevent import monkey
monkey.patch_all() # 可以监听该程序下所有的IO操作
import time
from gevent import spawn, joinall # 用于做切换 + 保存状态 def func1():
print('1')
# IO操作
time.sleep(1) def func2():
print('2')
time.sleep(3) def func3():
print('3')
time.sleep(5) start_time = time.time() s1 = spawn(func1)
s2 = spawn(func2)
s3 = spawn(func3) # s2.join() # 发送信号,相当于等待自己 (在单线程的情况下)
# s1.join()
# s3.join()
# 必须传序列类型
joinall([s1, s2, s3]) end_time = time.time() print(end_time - start_time)

ProcessPoolExecutor对象

跟线程方法一样,就是使用多进程完成.

支持上下文管理

concurrent.futrues.ProcessPoolExecutor继承自concurrent.futrues.base.Executor,

支持上下文管理,可以使用with语句

回调函数

将一个函数的返回值直接传递给另一个函数

# 回调函数
def call_back(res):
print(type(res))
# 注意: 赋值操作不要与接收的res同名
res2 = res.result()
print(res2) for line in range(5):
pool.submit(task, 1).add_done_callback(call_back) # 会让所有线程池的任务结束后,才往下执行代码
# pool.shutdown() print('hello')

总结

这个库统一了线程池,进程池的调用,简化了编程

唯一缺点:无法设置线程名称,无所吊谓

concurrent模块的更多相关文章

  1. Python程序中的线程操作(线程池)-concurrent模块

    目录 Python程序中的线程操作(线程池)-concurrent模块 一.Python标准模块--concurrent.futures 二.介绍 三.基本方法 四.ProcessPoolExecut ...

  2. Python程序中的线程操作-concurrent模块

    目录 一.Python标准模块--concurrent.futures 二.介绍 三.基本方法 四.ProcessPoolExecutor 五.ThreadPoolExecutor 六.map的用法 ...

  3. Python开发【模块】:Concurrent

    concurrent 模块 回顾: 对于python来说,作为解释型语言,Python的解释器必须做到既安全又高效.我们都知道多线程编程会遇到的问题,解释器要留意的是避免在不同的线程操作内部共享的数据 ...

  4. python并发模块之concurrent.futures(一)

    Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threadin ...

  5. python的并发模块concurrent

    Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor和ProcessPoolExecutor两个类,实现了对threadin ...

  6. Haskell语言学习笔记(84)Concurrent

    Control.Concurrent Prelude> import Control.Concurrent Prelude Control.Concurrent> Control.Conc ...

  7. python:常用模块 知识整理

    time模块 time.time() # 时间戳:1487130156.419527 time.strftime("%Y-%m-%d %X") #格式化的时间字符串:'2017-0 ...

  8. Concurrent.Thread.js

    (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'functi ...

  9. 使用express4.X + jade + mongoose + underscore搭建个人电影网站

    (-。-;), 周末过得真是快啊,  很久以前就看到imooc上有个搭建个人电影网站一期 ,二期的视频, 这两周宅家里撸玩没事干, 我也学着搭了一个, 这些东西都是基础, 只要花点时间很好学的, no ...

随机推荐

  1. 搭建nodejs代理服务器,从而解决跨域问题

    先在同级处新建js文件(app.js) 使用时npm 安装 Node.js 模块语法 也就是对应的文件所在地“npm install”一下 然后安装对应需要的模块: expresspathreques ...

  2. 你所不知道的Mac截图的强大

    Mac的截图功能扩展功能很强大的,不要用QQ那个COM+Ctrl+A弱爆了的截图了~ 首先说一下两种截图 1.Command+shift+3:全屏截图,保存截图到桌面 2.Command+shift+ ...

  3. gitlab merge request

    分支提了mr之后, 又有commit 不用重新提mr,mr中会自动更新 要保证项目下的.git目录中有hooks这个目录(如果是从github迁移到gitlab的项目, 可能没有这个目录, 导致mr不 ...

  4. redis教程(三)-----redis缓存雪崩、缓存穿透、缓存预热

    缓存雪崩 概念 缓存雪崩是由于原有缓存失效(过期),新缓存未到期间.所有请求都去查询数据库,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机.从而形成一系列连锁反应,造成整个系统崩溃. 解决 ...

  5. jeecms系统_自定义对象流程

    库内新增对象Products 的流程说明: 第一步: com.jeecms.cms.entity.assist.base下建立模型基础类,BaseCmsProducts.java com.jeecms ...

  6. 关于Cocos2d-x多线程异步载入资源的问题

    我们通常使用CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("xxx.plist" ...

  7. JasperReport填充报表6

    任何报告工具的主要目的是为了生产出高品质的文档.举报填充过程有助于报告工具通过操纵数据集来实现这一目标.需要报表填充过程的主要输入是: 报表模板:这是实际的JasperReport文件 报告参数:这些 ...

  8. shell中各种括号的作用详解()、(())、[]、[[]]、{}

    一.小括号,圆括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号, ...

  9. input光标错位

    文档结构 <div class="noteWrap"> <input type="text" placeholder="写留言&qu ...

  10. memcache 拓展

    需要安装Libevent.memcached.memcache. 参考网址:https://www.cnblogs.com/hejun695/p/5369610.html 启动:/usr/local/ ...