强制事件循环切换#
在 Python 的异步编程中,强制事件循环切换的核心思路是 主动让出协程控制权或插入调度点,以下是具体实现方法及原理:
使用 await
主动让出控制权#
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)
将当前协程挂起并立即重新加入事件循环队列,触发任务切换。
await asyncio.shield()
通过保护协程并插入调度点:
await asyncio.shield(asyncio.sleep(0)) # 强制切换但不取消当前任务
频繁使用 await asyncio.sleep(0)
会增加调度开销,降低性能。应优先依赖事件循环的自动调度机制。