[英]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.