强制事件循环切换

强制事件循环切换#

在 Python 的异步编程中,强制事件循环切换的核心思路是 主动让出协程控制权或插入调度点,以下是具体实现方法及原理:

使用 await 主动让出控制权#

  1. await asyncio.sleep(0) 通过等待零延时的异步操作,强制事件循环切换到其他就绪任务:

import asyncio 

async def task1():
    # while 1:
    for _ in range(2):
        print("Task 1 执行")
        await asyncio.sleep(0)   # 关键点:主动让出控制权

async def task2():
    # while 1:
    for _ in range(2):
        print("Task 2 执行")
        await asyncio.sleep(0) 

async def main():
    t1 = asyncio.create_task(task1()) 
    t2 = asyncio.create_task(task2()) 
    await asyncio.gather(t1,  t2)

# asyncio.run(main())
await main()
Task 1 执行
Task 2 执行
Task 1 执行
Task 2 执行

asyncio.sleep(0) 将当前协程挂起并立即重新加入事件循环队列,触发任务切换。

  1. await asyncio.shield() 通过保护协程并插入调度点:

await asyncio.shield(asyncio.sleep(0))   # 强制切换但不取消当前任务 

频繁使用 await asyncio.sleep(0) 会增加调度开销,降低性能。应优先依赖事件循环的自动调度机制。