深入Asyncio(六)Tasks and Futures
Tasks and Futures
大多数的工作只涉及到Task、create_task()方法,就像前面代码一样,Future是Task的父类,提供与loop交互的所有功能。
Future对象表示某个活动的未来完成状态,由loop管理,Task与之完全相同,但其活动特指coroutine。Future表示与loop交互的状态,Future对象描述的是完成状态的切换,其实例创建时状态是“尚未完成”,然后在稍后的一段时间后,实例状态为完成,Future的实例有一个done()方法用于检查状态。
>>> from asyncio import Future
>>> f = Future()
>>> f.done()
False
Future实例可能:
- 有一个结果集(
set_result(value)、result()); - 可用
cancel()取消(通过cancelled()检查); - 拥有回调函数,并在完成时执行。
即使Task更普遍,但Future仍然无法避免,例如在executor中运行一个函数会返回一个Future对象而非Task。
>>> async def main(f: asyncio.Future): # 1
... await asyncio.sleep(1)
... f.set_result('I have finished') # 2
>>> loop = asyncio.get_event_loop()
>>> fut = asyncio.Future() # 3
>>> print(fut.done()) # 4
False
>>> loop.create_task(main(fut)) # 5
<Task pending coro=<main() running at <stdin>:1>>
>>> loop.run_until_complete(fut) # 6
'I have finished'
>>> print(fut.done())
True
>>> print(fut.result()) # 7
I have finished
- 创建一个简单的主函数;
- 为Future对象设置结果;
- 手动创建一个Future对象,该对象默认绑定在当前loop上,不能也不会属于任何coroutine;
- 在做任何事之前,先确认Future对象完成状态;
- 调度主程序,并将Future对象传递进去,主程序只是sleep,然后切换到Future对象,并且此时loop还未启动;
- 这里与以前不同的是,用Future对象而不是Task对象,现在loop开始运行;
- Future在设置结果时完成,然后可以访问结果。
绝大多数代码都不会像上面一样直接用Future对象,这里仅作学习用。
用create_task还是ensure_future?
后者很容易造成误解,从官方的函数docstring看:
asyncio.ensure_future(coro_or_future, *, loop=None)
Schedule the execution of a coroutine object: wrap it in a future. Return a Task object.
If the argument is a Future, it is returned directly.
清楚的解释一下:
1. 如果传入一个coroutine,它将返回一个Task(coroutine将会在loop中调度),这与直接调用create_task()没区别;
2. 如果传入一个Future,直接返回,完全没有改变地!
import asyncio
async def f(): # 1
pass
coro = f() # 2
loop = asyncio.get_event_loop() # 3
task = loop.create_task(coro) # 4
assert isinstance(task, asyncio.Task) # 5
new_task = asyncio.ensure_future(coro) # 6
assert isinstance(new_task, asyncio.Task)
mystery_meat = asyncio.ensure_future(task) # 7
assert mystery_meat is task # 8
- 一个coroutine function;
- 获得coroutine;
- 获得loop;
- 通过create_task调度coroutine;
- 类型检查;
- 与create_task相同;
- Task是Future的子类,这里直接传入一个已经创建好的Task实例;
- 结果是True,完全没区别。
实际上,ensure_future()是提供给框架开发者处理两种参数用的。
在3.7中,asyncio提供了asyncio.create_task(coro)方法来为运行中的loop添加task,ensure_future()可以失业了。
深入Asyncio(六)Tasks and Futures的更多相关文章
- asyncio之Coroutines,Tasks and Future
asyncio之Coroutines,Tasks and Future Coroutines and Tasks属于High-level APIs,也就是高级层的api. 本节概述用于协程和任务的高级 ...
- [Python 多线程] asyncio (十六)
asyncio 该模块是3.4版本加入的新功能. 先来看一个例子: def a(): for x in range(3): print('a.x', x) def b(): for x in 'abc ...
- 六十四 asyncio
asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持. asyncio的编程模型就是一个消息循环.我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要 ...
- 爬虫高性能 asyncio库 twisted库 tornado库
一 背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行,那只能等待爬取一个结束后才能继续下一个,效率会非常低. 需要强调的是 ...
- asyncio并发编程
一. 事件循环 1.注: 实现搭配:事件循环+回调(驱动生成器[协程])+epoll(IO多路复用),asyncio是Python用于解决异步编程的一整套解决方案: 基于asynico:tornado ...
- asyncio
一.简介 asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持. asyncio的编程模型就是一个消息循环.我们从asyncio模块中直接获取一个EventLoop的引用, ...
- python中重要的模块--asyncio
一直对asyncio这个库比较感兴趣,毕竟这是官网也非常推荐的一个实现高并发的一个模块,python也是在python 3.4中引入了协程的概念.也通过这次整理更加深刻理解这个模块的使用 asynci ...
- 如何在django视图中使用asyncio(协程)和ThreadPoolExecutor(多线程)
Django视图函数执行,不在主线程中,直接 loop = asyncio.new_event_loop() # 更不能loop = asyncio.get_event_loop() 会触发 Runt ...
- Python并发编程之学习异步IO框架:asyncio 中篇(十)
大家好,并发编程 进入第十章.好了,今天的内容其实还挺多的,我准备了三天,到今天才整理完毕.希望大家看完,有所收获的,能给小明一个赞.这就是对小明最大的鼓励了.为了更好地衔接这一节,我们先来回顾一下上 ...
随机推荐
- 測試 電池溫度的 batch file
無限迴圈, 執行讀取 電池溫度, @echo off adb root :loop echo %date% %time% adb shell "cat /sys/class/power_su ...
- Scrapy笔记:持久化,Feed exports的使用
首先要明确的是,其实所有的FeedExporter都是类,里面封装了一般进行io操作的方法.因此,要怎么输出呢?其实从技术实现来说,在生成item的每一步调用其进行储存都是可以的,只不过为了更加符合s ...
- 关于 gstreamer 和 webrtc 的结合,有点小突破
今天让我找到了 gstreamer 的一个牛叉的杀手锏,脑海中马上想到了一个大致的框架和方案计划,用 gst-inspector 先进行对象自省属性探测,然后祭出 gst-launcher 大刀进行管 ...
- PC网页js调用本地应用程序
最近要现实一个在PC网页中实现点击按钮调用本地应用程序的功能 其实实现原理也非常简单, 首先注册一个本地注册表文件,指向本地应用程序路径 其次在网页中用js指向这个注册表文件,就可以实现网页调用本地应 ...
- P1450 包裹快递 RP+14【二分】
[题目链接]:https://vijos.org/p/category/%E5%85%B6%E4%BB%96,%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE 描述 一个快递公 ...
- [深度应用]·Keras实现Self-Attention文本分类(机器如何读懂人心)
[深度应用]·Keras实现Self-Attention文本分类(机器如何读懂人心) 配合阅读: [深度概念]·Attention机制概念学习笔记 [TensorFlow深度学习深入]实战三·分别使用 ...
- Linux笔记:vim
文件搜索后显示高亮,即使退出编辑高亮依然存在.使用以下几个方法: 1)指令模式下运行:nohlsearch 2)运行set nohlsearc,可永久关闭搜索高亮 3)搜索任意不存在的字符串
- Unique Binary Search Trees II - LeetCode
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...
- Springboot如何优雅的解决ajax+自定义headers的跨域请求
1.什么是跨域 由于浏览器同源策略(同源策略,它是由Netscape提出的一个著名的安全策略.现在所有支持JavaScript 的浏览器都会使用这个策略.所谓同源是指,域名,协议,端口相同.),凡是发 ...
- 【spring boot】8.spring boot的日志框架logback使用
在继续上一篇的Debug调试之后,把spring boot的日志框架使用情况逐步蚕食. 参考:http://tengj.top/2017/04/05/springbo 开篇之前,贴上完整applica ...