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实例可能:

  1. 有一个结果集(set_result(value)result());
  2. 可用cancel()取消(通过cancelled()检查);
  3. 拥有回调函数,并在完成时执行。

即使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
  1. 创建一个简单的主函数;
  2. 为Future对象设置结果;
  3. 手动创建一个Future对象,该对象默认绑定在当前loop上,不能也不会属于任何coroutine;
  4. 在做任何事之前,先确认Future对象完成状态;
  5. 调度主程序,并将Future对象传递进去,主程序只是sleep,然后切换到Future对象,并且此时loop还未启动;
  6. 这里与以前不同的是,用Future对象而不是Task对象,现在loop开始运行;
  7. 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
  1. 一个coroutine function;
  2. 获得coroutine;
  3. 获得loop;
  4. 通过create_task调度coroutine;
  5. 类型检查;
  6. 与create_task相同;
  7. Task是Future的子类,这里直接传入一个已经创建好的Task实例;
  8. 结果是True,完全没区别。

实际上,ensure_future()是提供给框架开发者处理两种参数用的。

在3.7中,asyncio提供了asyncio.create_task(coro)方法来为运行中的loop添加task,ensure_future()可以失业了。

深入Asyncio(六)Tasks and Futures的更多相关文章

  1. asyncio之Coroutines,Tasks and Future

    asyncio之Coroutines,Tasks and Future Coroutines and Tasks属于High-level APIs,也就是高级层的api. 本节概述用于协程和任务的高级 ...

  2. [Python 多线程] asyncio (十六)

    asyncio 该模块是3.4版本加入的新功能. 先来看一个例子: def a(): for x in range(3): print('a.x', x) def b(): for x in 'abc ...

  3. 六十四 asyncio

    asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持. asyncio的编程模型就是一个消息循环.我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要 ...

  4. 爬虫高性能 asyncio库 twisted库 tornado库

    一 背景知识 爬虫的本质就是一个socket客户端与服务端的通信过程,如果我们有多个url待爬取,只用一个线程且采用串行的方式执行,那只能等待爬取一个结束后才能继续下一个,效率会非常低. 需要强调的是 ...

  5. asyncio并发编程

    一. 事件循环 1.注: 实现搭配:事件循环+回调(驱动生成器[协程])+epoll(IO多路复用),asyncio是Python用于解决异步编程的一整套解决方案: 基于asynico:tornado ...

  6. asyncio

    一.简介 asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持. asyncio的编程模型就是一个消息循环.我们从asyncio模块中直接获取一个EventLoop的引用, ...

  7. python中重要的模块--asyncio

    一直对asyncio这个库比较感兴趣,毕竟这是官网也非常推荐的一个实现高并发的一个模块,python也是在python 3.4中引入了协程的概念.也通过这次整理更加深刻理解这个模块的使用 asynci ...

  8. 如何在django视图中使用asyncio(协程)和ThreadPoolExecutor(多线程)

    Django视图函数执行,不在主线程中,直接 loop = asyncio.new_event_loop() # 更不能loop = asyncio.get_event_loop() 会触发 Runt ...

  9. Python并发编程之学习异步IO框架:asyncio 中篇(十)

    大家好,并发编程 进入第十章.好了,今天的内容其实还挺多的,我准备了三天,到今天才整理完毕.希望大家看完,有所收获的,能给小明一个赞.这就是对小明最大的鼓励了.为了更好地衔接这一节,我们先来回顾一下上 ...

随机推荐

  1. Docker(一):什么是docker

    Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux 基金会,遵从了 ...

  2. CCCC L2-010. 排座位【并查集/分类讨论】

    L2-010. 排座位 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位. ...

  3. Unix/Linux提权漏洞快速检测工具unix-privesc-check

    Unix/Linux提权漏洞快速检测工具unix-privesc-check   unix-privesc-check是Kali Linux自带的一款提权漏洞检测工具.它是一个Shell文件,可以检测 ...

  4. codevs 1450 xth 的旅行

     时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 毕业了,Xth很高兴,因为他要和他的 ra ...

  5. sql server book

    http://www.sqlpassion.at/blog/ http://www.sqlservercentral.com/Books/

  6. 如何自学Android, 教大家玩爆Android

    http://blog.csdn.net/xiaole0313/article/details/51714223 http://blog.csdn.net/xiaole0313/article/det ...

  7. Mac测试模拟慢网速

    先普及一下Kb,KB,Kbps,Mb,Mbps等一些列概念 1Byte = 8bit 1KB (Kilobyte 千字节)=1024Byte 1MB (Megabyte,兆字节,简称“兆”)=1024 ...

  8. 动态设置表格[GridView]在编辑时 只读。

    找到GridView的CellEditorInitalize事件. protected void agv_main_CellEditorInitialize(object sender, ASPxGr ...

  9. cocos2dx 2.x新建项目

    举例: cocos2d-x-2.2.6/tools/project-creator 进入 这个文件夹 chmod 777 project-cereator.py ./create_project.py ...

  10. DedeCMS 列表页调用图集内容多张图片的方法

    新做一个以图片为主的网站,采用的DEDECMS图集,列表页要求直接调内容面的大图,解决方法如下:(主要是采用php的正则匹配函数preg_match_all函数来巩固复习下该函数:preg_match ...