首页 > 解决方案 > asyncio create_task 永远运行

问题描述

我有以下代码

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再次致电。

标签: pythonpython-3.xpython-asyncio

解决方案


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

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

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


推荐阅读