这是代码。
import asyncio
async def run_test():
print("run1")
await asyncio.sleep(1)
print("run2")
async def main():
print("main1")
loop = asyncio.get_event_loop()
task = loop.create_task(run_test())
#task = asyncio.create_task(run_test())
#task = asyncio.ensure_future(run_test())
print("main2")
print("________________")
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
print("________________")
我期待类似的输出
________________
main1
main2
________________
因为任务尚未等待。但输出实际上是
________________
main1
main2
run1
________________
如果我在 run_test() 中删除 async.sleep() ,它就会变成这样:
________________
main1
main2
run1
run2
________________
我也尝试过
#task = asyncio.create_task(run_test())
#task = asyncio.ensure_future(run_test())
结果是一样的。 3个问题:
“事件循环的单次迭代”(称为
run_once()
)包括连续运行每个“就绪任务”,直到没有就绪任务为止。
“就绪任务”是当前未产生的计划任务(即不等待
asyncio.sleep()
)。
函数
loop.run_until_complete(main())
的工作原理如下(简而言之):
task = self.create_task(main())
while not task.completed:
self.run_once()
我们通过调用
run_once()
开始事件循环的第一次迭代。在第一次迭代中,会发生以下情况:
main()
是一个“就绪任务”,因此它开始执行
print("main1")
输出“main1”asyncio.create_task(run_test())
将新任务添加到循环中。处于“就绪”状态print("main2")
输出“main2”main()
返回,完成任务run_test()
是一个“就绪任务”,因此它开始执行
print("run1")
输出“run1”await asyncio.sleep(1)
使任务屈服,将控制权返回给循环。设置一个属性来标记该任务将在未来 1 秒再次准备好。现在
main()
任务已完成,run_until_complete
将不会启动事件循环的另一次迭代,并且您的程序将退出。请注意,run_test()
任务从未有机会完成。