python asyncio
协程
可以被人为调度,遇到IO阻塞时候自动切换到其他事件循环里的任务。
事件循环
理解为一个死循环,去检测并执行某些代码
loop = asyncio.get_event_loop()
任务列表 = [任务1 任务2 任务3 ...]
while True:
可执行任务,已完成任务 = 检查任务列表中的任务
for task in [可执行任务]:
执行已就绪的任务
for task in 已完成任务:
从任务列表中移除
如果任务列表的任务都完成了,则终止循环
async
协程函数:使用async def fun()
定义的函数
协程对象:执行协程函数 func()
得到的对象
await
await + 可等待对象
可等待对象:
- 协程对象 func() (func是被这么定义:async def func())
- future 对象: asyncio.ensure_future() 旧版本中使用,loop.create_future()
- task 对象:asyncio.create_task(coro_obj)
def func(s):
print(s)
func2_res = await func2()
await 表示主动让出计算资源,等待这个IO完成再继续执行。
task
在事件循环中添加多个任务
async def main():
创建任务,将当前执行任务添加到事件循环,如果此时没有事件循环会报错
tasks = (asyncio.create_task(func(i)) for i in range(10))
done, pendding = await asyncio.wait(tasks, timeout=2)
asyncio.run(main())
改写:
coro_obj = (func(i) for i in range(10))
done, pendding = asyncio.run(asyncio.wait(coro_obj, timeout=2))
asyncio.future 对象
更底层,是 task 类的基类,task 对象内部 await 结果是基于 future
拓展:concurrent.futures.Future 对象:使用进程池、线程池进行异步操作时用到的对象。
TODO
异步迭代器,异步上下文管理
ref: