python-asyncio

参考
参考

  • python由于GIL(全局锁)的存在,不能发挥多核的优势,在io密集型的网络里,异步处理能大幅提升效率

  • coroutine(协程)

    • 协程处理逻辑
      • 通常用生产者-消费者设计模式来处理协程
      • 创建协程 -> 添加到队列 -> 创建协程 -> 添加到队列 -> 消费者绑定对象 -> 消费者消费队列中的协程
  • 任务处理的逻辑

    • 同步:触发任务1->处理任务1->触发任务2->处理任务2->顺序执行
    • 异步:触发任务1->触发任务2->触发任务3(只触发,不处理)
def sync_run():
    print('start') # 打印事件,处理
    time.sleep(1)  # 等待事件,处理
    print('end')   # 打印事件,处理


import asyncio

async def demo(n: int):
    print('start',n)
    await asyncio.sleep(n)
    print('stop',n)

tasks = []

# 打印2112
tasks.append(demo(2)) 
tasks.append(demo(1))

# 打印1212
# tasks.append(demo(1))
# tasks.append(demo(2))

loop = asyncio.get_event_loop()
future = asyncio.wait(tasks)
loop.run_until_complete(future) # 消费

  • async&asyncio
    • async def demo():pass,定义一个方法,这个方法是异步方法,demo()后会创建一个coroutine协程对象,然后交出执行权,不会像方法一样直接执行,必须加入到event loop后统一执行
    • await,执行协程过程中遇到了await,则会在异步任务开始之后暂停当前协程的执行,把执行权交给其他任务,等到异步任务执行结束,再执行
    • 创建协程对象,执行协程
    • 创建event-loop,创建协程对象,执行协程对象,遇到异步任务,交出执行权,执行下一个协程对象,一直循环这个处理逻辑

总结:async描述一个协程对象,await描述一个异步任务,queue存储协程对象,loop处理协程对象和异步任务

原文地址:https://www.cnblogs.com/bonus_scene/p/15187512.html