gpt4 book ai didi

Python asyncio 任务不启动

转载 作者:太空宇宙 更新时间:2023-11-04 09:36:49 24 4
gpt4 key购买 nike

我试图理解 python asyncio lib,但这很痛苦,每次我认为我知道代码的行为方式时,都会让我感到惊讶。

我有以下代码:

async def a():
while True:
task = asyncio.current_task() # asyncio.Task.current_task()
print(task.name)
await asyncio.sleep(0.5)

async def main():
tasks = []

for i in range(10):
c = a()
task = asyncio.create_task(c)
task.name = "task nr {}".format(i)
tasks.append(task)

for task in tasks:
await task

asyncio.run(main())

怀疑会产生以下输出:

task nr 0
task nr 1
task nr 2
task nr 3
task nr 4
task nr 5
task nr 6
task nr 7
task nr 8
task nr 9

等等。另一方面,我有一个代码

async def a():
while True:
task = asyncio.current_task() # asyncio.Task.current_task()
print(task.name)
await asyncio.sleep(0.5)

async def main():

for i in range(10):
c = a()
task = asyncio.create_task(c)
task.name = "task nr {}".format(i)
await task

asyncio.run(main())

这次它只输出“task nr 0”。

在第一个中创建 10 个任务,然后启动所有这些任务。第二个合并了这两个循环 - 为什么它会影响程序的行为?

最佳答案

The second one merges those two loops - why it affects behaviour of the program?

因为您的第一个代码运行 create_task在到达 await 之前为所有十个协程。

由于 create_task 安排协程的执行,在第一个示例中,所有十个协程都愉快地并行执行,而您正在等待第一个协程(作为另一个答案 points out,将永远不会完成,因为协程是无限的)。在第二个循环中,您仅在无限等待之前执行一个 create_task,因此您只会运行一个协程。

如果您熟悉线程,也许以下类比会有所帮助:您可以将 create_task 视为生成线程,将 await 视为加入线程。在第一个示例中,您生成了 10 个,而在第二个示例中,您只生成了一个。

关于Python asyncio 任务不启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53365645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com