原创不易,转载请联系作者
深入理解协程
分为三部分进行讲解:
- 协程的引入
- yield from实现异步协程
- async/await实现异步协程
本篇为深入理解协程
系列文章的最后一篇。
从本篇你将了解到:
async/await
的使用。- 如何从
yield from
风格的协程修改为async/await
风格。
篇幅较长,请耐心阅读。
async/await的引入
上篇【yield from实现异步协程】我们引入了asynico
模块,结合yield from
实现异步协程。但语法不够简洁,其中涉及的生成器,装饰器也让人头疼不已。
为了语法更加简洁。于是,在Python3.5(PEP 492)中新增了async/await
语法来实现异步协程。
async/await的使用
先介绍几个概念:
- async/await :python3.5之后用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口。
- event_loop :事件循环,程序开启一个无限的循环,程序员会把一些函数注册到事件循环上。当满足事件发生的时候,调用相应的协程函数。
- coroutine :协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。
- task :任务,是对协程进一步封装,其中包含任务的各种状态。
- future: 代表将来执行或没有执行的任务的结果。它和task上没有本质的区别
1.创建协程
在def前加上async的声明,就完成了一个协程函数的定义。协程函数不能直接调用运行,需要将协程注册到事件循环,并启动事件循环才能使用。
import asyncio
async def fun(a): # 定义协程函数
print(a)
# 调用协程函数,生成一个协程对象,此时协程函数并未执行
coroutine = fun('hello world')
# 创建事件循环
loop = asyncio.get_event_loop()
# 将协程函数添加到事件循环,并启动
loop.run_until_complete(coroutine)
# 输出
hello word
2. 任务对象task
协程对象不能直接运行,在注册事件循环的时候,其实是run_until_complete方法将协程包装成为了一个任务(task)对象。我们也可以显式实现它。
实现方式1:
使用create_task()创建task。
import asyncio
async def fun(a):
print(a)
return a
coroutine = fun('hello world')
loop = asyncio.get_event_loop()