用async def定义了一个函数,它返回一个coroutine
想调用它,正常情况下需要用await关键字
但是await关键字本身必须用在async定义的函数内
这就有了鸡生蛋问题
搜了一下发现:
asyncio.run可以处理这个
定义在asyncio/runners.py里
我觉得这玩意就是我之前提问想要的答案
但是我不知道它自己是怎么规避鸡生蛋的语法限制的
查看源码发现:
asyncio.run()为了伺候一个coroutine,单独生成了一个event loop并调用其
run_until_complete()方法,而该方法在设置完callback之后就运行了run_forever()方
法
run_until_complete()方法调用ensure_future()方法,把coroutine包装为future
而ensure_future调用了loop.create_task()方法
在create_task()中,task类初始化时,调用loop的call_soon()将自身注册到loop中去了
所以后来run_forever()处理的tasks里就有这个task/future/coroutine了
最核心的位置:
tasks.py def__step_run_and_handle_result函数
使用coroutine的send方法进行了实际执行
从而规避了“必须使用await”的语法限制
--
修改:JulyClyde FROM 139.227.18.*
FROM 139.227.18.*