协程与任务

本节将简述用于协程与任务的高层级 API。

 

协程

协程通过 async/await 语法进行声明,是编写异步应用的推荐方式。例如,以下代码段 (需要 Python 3.7+) 打印 "hello",等待 1 秒,然后打印 "world":

>>>

注意:简单地调用一个协程并不会将其加入执行日程:

>>>

要真正运行一个协程,asyncio 提供了三种主要机制:

 

可等待对象

如果一个对象可以在 await 语句中使用,那么它就是 可等待 对象。许多 asyncio API 都被设计为接受可等待对象。

可等待 对象有三种主要类型: 协程, 任务Future.

协程

Python 协程属于 可等待 对象,因此可以在其他协程中被等待:

重要

在本文档中 "协程" 可用来表示两个紧密关联的概念:

asyncio 也支持旧式的 基于生成器的 协程。

任务

任务 被用来设置日程以便 并发 执行协程。

当一个协程通过 asyncio.create_task() 等函数被打包为一个 任务,该协程将自动排入日程准备立即运行:

Future 对象

Future 是一种特殊的 低层级 可等待对象,表示一个异步操作的 最终结果

当一个 Future 对象 被等待,这意味着协程将保持等待直到该 Future 对象在其他地方操作完毕。

在 asyncio 中需要 Future 对象以便允许通过 async/await 使用基于回调的代码。

通常情况下 没有必要 在应用层级的代码中创建 Future 对象。

Future 对象有时会由库和某些 asyncio API 暴露给用户,用作可等待对象:

一个很好的返回对象的低层级函数的示例是 loop.run_in_executor()

运行 asyncio 程序

创建任务

休眠

并发运行任务

屏蔽取消操作

超时

简单等待

来自其他线程的日程安排

内省

Task 对象

 

基于生成器的协程

注解

对基于生成器的协程的支持 已弃用 并计划在 Python 3.10 中移除。

基于生成器的协程是 async/await 语法的前身。它们是使用 yield from 语句创建的 Python 生成器,可以等待 Future 和其他协程。

基于生成器的协程应该使用 @asyncio.coroutine 装饰,虽然这并非强制。

 

https://docs.python.org/zh-cn/3/library/asyncio-task.html