import asyncio
import time
async def func():
print('task start')
await asyncio.sleep(10)
print('task end')
async def main():
task1 = asyncio.create_task(func())
task2 = asyncio.create_task(func())
task3 = asyncio.create_task(func())
task4 = asyncio.create_task(func())
s = time.monotonic()
print('main start', time.monotonic() - s)
await task1
print('main continue', time.monotonic() - s)
await task2
print('main continue', time.monotonic() - s)
await task3
print('main continue', time.monotonic() - s)
await task4
print('main end', time.monotonic() - s)
asyncio.run(main())
该代码给出如下结果:
main start 0.0
task start
task start
task start
task start
task end
task end
task end
task end
main continue 10.0
main continue 10.0
main continue 10.0
main end
但是这怎么可能呢python绕过了我之前的打印调用, 先运行等待列表,然后返回打印通话, 我该如何理解这一点
您的代码按照
asyncio
的规范执行它应该执行的操作,但可能您误解了“任务”是什么从文档中:
这意味着,当您在主任务开始时创建了4个任务时,它们都计划在同一时间开始执行。因此,它们都一起打印
task start
,然后一起打印task end
,在这一点上,所有的await
都会立即失败,因为所有任务都在同一时间完成(10秒后)。最后你看到了main continue 10.0
3次试试这个代码,我相信它会有你期望的行为
你所有的任务都是睡眠10秒,然后继续并几乎立即完成。 因此,所有的
await
调用将同时解锁,因为当任务1完成时,所有任务也将完成你是对的,从技术上讲,你可以在
task end
和main continue
之间有相互交织的打印,但我想这是一个实现细节,所有内容似乎都是分组的我认为您可以通过使用此经过调整的脚本更好地了解正在发生的事情:
您将有一个更有趣的
await
行为:相关问题 更多 >
编程相关推荐