我对 python 中的 asyncio 有点陌生。我试图运行这个简单的代码,但我不知道为什么我会得到这个意外的输出。
我所做的是,在outer
函数,我创建了异步任务并将其存储在数组中tasks
。在等待这些任务之前,我写了一条打印语句print("outer")
应该在每次迭代中运行。在任务中我写了另一个打印语句print("inner")
in inner
功能。但我如何得到一些意想不到的输出。
这是代码 -
import asyncio
def main():
loop = asyncio.get_event_loop()
loop.run_until_complete(outer(loop))
loop.close()
async def outer(loop):
tasks = []
for i in range(0, 5):
tasks.append(loop.create_task(inner()))
for task in tasks:
print("outer")
await task
async def inner():
print("inner")
await asyncio.sleep(0.5)
if __name__ == '__main__':
main()
这是输出 -
outer
inner
inner
inner
inner
inner
outer
outer
outer
outer
我的预期输出是 -
outer
inner
outer
inner
outer
inner
outer
inner
outer
inner
为什么所有的inner
之前正在打印outer
。 asyncio的正确执行流程是怎样的?提前致谢。
In async def outer(loop)
for i in range(0, 5):
tasks.append(loop.create_task(inner()))
- 五新
inner
任务已创建、计划并开始运行。
- 事件循环运行计划任务直到完成。
如果你再添加一点inner
and outer
它更好地展示了这个过程:
async def outer(loop):
tasks = []
for i in range(0, 5):
tasks.append(loop.create_task(inner(i)))
await asyncio.sleep(3)
for task in tasks:
print('outer')
await task
async def inner(n):
print(f"inner {n} start")
await asyncio.sleep(0.5)
print(f'inner {n} end')
我对控制一切的事件循环有点模糊 - 我没有找到任何明确的文档 - 可能在create_task
docs: Wrap the coro coroutine into a Task and schedule its execution.
当您创建任务时,它就会被安排。我在 pyvideo.org 上看过显示该过程的视频,不幸的是我无法快速找到我想要链接的视频。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)