繁体   English   中英

动态创建将永远运行的异步任务

[英]Dynamically create asyncio tasks that will run forever

我需要动态创建异步任务(例如:loop.create_task()) ,这些任务将永远运行。

在这种情况下,“一劳永逸”的最佳方法是什么? 我知道非等待的任务将被垃圾收集,这就是我发现自己被迫等待永远运行的任务的原因。

更多上下文:

我有一个计划好的例程,最终需要创建一个任务。 结果,我将有许多将永远运行的任务。

谢谢你的帮助。

在这种情况下,“一劳永逸”的最佳方法是什么? 我知道非等待的任务将被垃圾收集,

这不是真的:由asyncio.create_task()创建的非等待任务只要运行就不会被垃圾回收。 它们由事件循环拥有,并且将运行到完成(或者永远不会完成,如果它们被编写为永远运行),无论它们是否被显式等待。

例如,此代码创建两个“后台”任务而不等待它们,然后继续执行其他操作。

async def counter(msg, delay):
    i = 0
    while True:
        print(msg, i)
        i += 1
        await asyncio.sleep(delay)

async def main():
    # create two task
    asyncio.create_task(counter('slow', 1))
    asyncio.create_task(counter('fast', .3))
    # ...and wait forever
    await asyncio.Event().wait()

asyncio.run(main())

这就是我发现自己被迫等待永远运行的任务的原因。

在可能的情况下等待后台任务当然是个好主意,这样您就可以收集它们的结果或接收它们引发的异常,但这绝不是必需的。 有些任务没有有意义的返回值,让它们自行运行也没关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM