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:

posted @ 2022-05-15 18:07  Jneeee  阅读(113)  评论(0编辑  收藏  举报