asyncio create_task永远运行

sla*_*law 4 python python-3.x python-asyncio

我有以下代码

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())
Run Code Online (Sandbox Code Playgroud)

我希望while_loop函数永远运行,但它似乎只是作为调用的结果执行,run_until_complete并且一旦some_func完成执行就停止打印while循环.我看到的输出是:

0
1
2
Some Func
Run Code Online (Sandbox Code Playgroud)

我预计数字会在some_func完成后继续打印.

0
1
2
Some Func
3
4
5
6
.
.
.
Run Code Online (Sandbox Code Playgroud)

获得更多数字的唯一方法是some_func再次打电话.

use*_*342 9

我预计数字会在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.

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

  • 最后,清楚地解释了如何在“run_until_complete()”阻塞主线程后将任务添加到循环中。 (2认同)