可以使用asyncio.ensure_future()将协程包装在一个Future对象中,然后将其放入事件循环中运行。这样就可以避免在协程中使用asyncio.sleep(0)导致的问题。具体示例如下:
import asyncio
async def foo():
print("start")
await asyncio.sleep(0)
print("end")
async def bar():
print("start")
await asyncio.ensure_future(asyncio.sleep(0))
print("end")
loop = asyncio.get_event_loop()
loop.run_until_complete(foo())
loop.run_until_complete(bar())
上面的示例中,foo()函数中使用了asyncio.sleep(0),而bar()函数中使用了asyncio.ensure_future()解决了控制权传递的问题。运行这两个协程可以看到,foo()函数中的控制权没有转移,而bar()函数中的控制权正常传递给了事件循环。