• 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:

  • 相关阅读:
    servlet学习之servletAPI编程常用的接口和类
    问题解决
    HTTP Status 500 – Internal Server Error
    用数组模拟队列
    稀疏数组
    值传递机制及几道网红题目
    关于Tomcat配置问题
    Servlet学习笔记
    面向对象笔记
    数组中涉及的常见算法
  • 原文地址:https://www.cnblogs.com/jneeee/p/asyncio.html
Copyright © 2020-2023  润新知