gpt4 book ai didi

python - asyncio create_task 永远运行

转载 作者:太空狗 更新时间:2023-10-30 02:01:19 26 4
gpt4 key购买 nike

我有以下代码

import asyncio

loop = asyncio.get_event_loop()

async def while_loop():
n = 0
while True:
print(f"{n}")
await asyncio.sleep(2)
n = n+1

async def some_func():
await asyncio.sleep(5)
print("Some Func")

future = loop.create_task(while_loop())
loop.run_until_complete(some_func())

我希望 while_loop 函数永远运行,但它似乎只在调用 run_until_complete 后执行,并且一旦 some_func< 就停止打印 while 循环 执行完毕。我看到的输出是:

0
1
2
Some Func

我希望即使在 some_func 完成后这些数字也会继续打印。

0
1
2
Some Func
3
4
5
6
.
.
.

打印更多数字的唯一方法是再次调用 some_func

最佳答案

I expected the numbers to keep printing even after some_func is completed.

run_until_complete 的参数控制事件循环运行的时间。一旦事件循环停止运行,所有 协程都会有效暂停,而不仅仅是您一直在等待的协程。但是您确实有不同的选择:

  • loop.run_until_complete(some_func()) - 你已经用过的;运行事件循环,直到 some_func 协程完成。在此期间也并行执行其他协程,但也会在事件循环完成后立即停止执行它们。

  • loop.run_forever() - 运行事件循环,直到某个协程或回调调用 loop.stop()。如果他们都不这样做,那么即使所有协程都结束了,事件循环也不会停止。在你的情况下,你会调用 loop.create_task(while_loop()) 然后是 loop.create_task(some_func()) 然后是 loop.run_forever().

  • loop.run_until_complete(asyncio.gather(while_loop(), some_func())) 运行事件循环,直到两个指定协程完成。这(等待 所有 任务)显然是您期望 loop.run_until_complete() 自动执行的操作,即使您只指定一个,但它不是那样工作的,它会在指定协程完成后立即停止。 asyncio.gather可用于同时等待多个协程。有关更精细的等待控制,另请参阅 asyncio.wait .

由于您的协程之一会永远运行,所以最后两个选项将是等效的,并且会产生预期的输出。

关于python - asyncio create_task 永远运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50592540/

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