asyncio create_task 到 运行 永远

asyncio create_task to run forever

我有以下代码

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 后执行并且它停止打印一次 while 循环 some_func执行完毕。我看到的输出是:

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 的参数控制事件循环的长度运行。一旦事件循环停止 运行ning,所有 协程将有效暂停,而不仅仅是您一直在等待的协程。但是你有不同的选择:

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

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

  • loop.run_until_complete(asyncio.gather(while_loop(), some_func())) 运行 事件循环直到 both 指定的协程完成。这(等待 所有 任务)显然是你期望 loop.run_until_complete() 自动执行的,即使你只命名一个,除了它不是那样工作的,它停止为一旦指定的协程完成。 asyncio.gather can be used to wait for multiple coroutines at once. For a more fine-tuned control of waiting, also see asyncio.wait.

由于您的协程之一 运行 永远存在,因此最后两个选项将是等效的,并将产生预期的输出。