取消所有异步任务/不一致的py循环

时间:2020-05-03 22:55:51

标签: python python-asyncio discord.py

我有一个不和谐的py机器人,它有8个左右的循环不断运行。有时,这些循环会由于没有明显的原因而停止(即,我看不到任何异常)。

我听说“重新启动”这些循环的最佳方法是卸载和加载包含循环的Cog,self.bot.reload_extension(cog)可以完成。我有这个,但是显然重新加载扩展并不会停止任何正在运行的循环,这意味着我的机器人现在每个循环执行两次。

我需要重新启动任务,并且我一直在寻找如何执行此操作的方法,但是我没有找到任何成功。这是我到目前为止(来自https://docs.python.org/3/library/asyncio-task.html#asyncio.Task.cancel):

如果我执行此功能,它将找到所有任务,然后按两次取消键,等待两次,但随后停止。不再处理任何循环,不会引发任何错误。

    async def CancelLoops(self):
        tasks = asyncio.Task.all_tasks()
        for task in asyncio.Task.all_tasks():
            task.cancel()      
            try:
                await task
            except asyncio.CancelledError:
                print("Cancelled now")                       

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你的循环应该像这样运行:

@tasks.loop(seconds=5)
async def my_first_loop():
    # Do something here
    pass

如果是这样,那么重新启动循环的方法将是这样

@my_first_loop.error
async def my_first_loop_error_handler(ctx,error):
    if isInstance(error, YourErrorClass):
        # do this and that
        my_first_loop.restart()