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_completesome_func执行,一旦执行完毕,它将停止打印while循环我看到的输出是:

0
1
2
Some Func

我希望数字即使some_func完成也能继续打印

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

获得更多号码的唯一方法是some_func再次拨打电话

user4815162342:

我希望数字即使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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章