外观
异步编程相关概念
asyncio 库
asyncio是python3.4之后引入的标准库,内置对异步IO的支持。asyncio的编程模型是一个消息循环,我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行,就实现了异步IO。
event_loop事件循环:程序开启一个无限的循环,程序员会把一些函数注册到事件循环上,当满足事件发生的时候,调用相应的协程函数。coroutine协程:协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。task任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装,其中包含任务的各种状态。future: 代表将来执行或者没有执行的任务的结果,它和task没有本质上的区别async / await关键字:python3.5用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口。
事件循环
理解成一个死循环,会去检测某些代码。
# 伪代码
任务列表 =[任务1、任务2....]
while True:
可执行的任务列表, 执行完成的任务列表 = 去任务列表中检查所有的任务, 将“可执行”和“已完成”的任务返回
for 就绪任务 in 可执行任务列表:
执行就绪任务
for 已完成的任务 in 执行完成的任务列表:
任务列表中移除 已完成的任务
如果 任务列表 中任务都完成,则终止循环创建事件循环
import asyncio
# 异步任务1
async def work_1():
for _ in range(5):
print('我是异步任务1')
await asyncio.sleep(1)
# 异步任务2
async def work_2():
for _ in range(5):
print('我是异步任务2')
await asyncio.sleep(1)
tasks = [
work_1(),
work_2()
]
async def main():
await asyncio.gather(*tasks)
asyncio.run(main())