在回调函数中使用asyncio.ensure_future()函数来调用协程,而不是使用Asyncio.create_task()。因为在回调函数中,事件循环可能已经执行了一部分任务,无法立即执行新的任务,而asyncio.ensure_future()函数可以在事件循环中安排协程的执行。
示例代码:
import asyncio
async def main():
loop = asyncio.get_running_loop()
loop.call_soon(cb)
print("Callback scheduled")
async def cb():
print("Callback started")
await asyncio.sleep(1)
print("Callback finished")
asyncio.run(main())
如果将下面这句话替换为使用Asyncio.create_task()来调用协程,那么程序将会卡住不动。
loop.call_soon(cb)
可以将上面这句话改为下面这句话,使用asyncio.ensure_future()来调用协程。
asyncio.ensure_future(cb())