在协程中使用asyncio.sleep(0)时,实际上并不会使协程主动让出控制权给事件循环。而是因为asyncio的协程调度机制不会强制性的切换执行上下文,而是在协程中主动yield或者await时才会进行上下文切换。
解决方法是,在协程中使用asyncio.sleep(0)时,应该主动让出控制权,比如使用await asyncio.sleep(0),这样就能保证当前协程让出控制权给事件循环,使得其他协程和事件能够得到及时处理。以下是一个使用await asyncio.sleep(0)的示例代码:
import asyncio
async def coro_a(): while True: print('a') await asyncio.sleep(0)
async def coro_b(): while True: print('b') await asyncio.sleep(0)
if name == 'main': loop = asyncio.get_event_loop() loop.create_task(coro_a()) loop.create_task(coro_b()) loop.run_forever()