我有一个不和谐的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")
答案 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()