Discord.py:事件循环关闭后重启机器人

Discord.py: Restarting a bot after the event loop closes

我有一个 discord.py 机器人,我目前正在本地托管它,等待它成熟。 我想让它能够抵御互联网连接中的瞬间故障,但我遇到了困难。当连接失败时,代表正常机器人操作的阻塞 Client.run() 完成并关闭事件循环。我不能在几分钟后重新调用 Client.run(),因为事件循环已关闭。

我试过重新声明 Client 对象,但这似乎没有使用新的事件循环。我正在浏览 discord.py 和 python 事件循环文档,但无法弄清楚如何获取新的事件循环并改用它。

我已经尝试了 asyncio.set_event_loop(asyncio.new_event_loop()) 的方法,但似乎没有任何区别 - 我仍然无法重新调用 Client.run(),因为事件循环已关闭。

在互联网连接中断的情况下,现有的事件循环没有任何问题。只需不要调用 Client.run 即可关闭事件循环。由于 Client.run 无论如何都是 run_until_complete 的一个简单包装器,它关闭了事件循环,您可以编写自己的包装器而不这样做。例如:

def run_client(client, *args, **kwargs):
    loop = asyncio.get_event_loop()
    while True:
        try:
            loop.run_until_complete(client.start(*args, **kwargs))
        except Exception as e:
            print("Error", e)  # or use proper logging
        print("Waiting until restart")
        time.sleep(600)