【问题标题】:Discord.py: Restarting a bot after the event loop closesDiscord.py:事件循环关闭后重新启动机器人
【发布时间】:2018-08-11 10:19:26
【问题描述】:

我有一个 discord.py 机器人,我目前正在本地托管它,它正在成熟。 我想让它能够抵御我的互联网连接中的瞬间中断,但我很难过。当连接失败时,代表正常bot操作的阻塞Client.run()结束并关闭事件循环。几分钟后我不能再打电话给Client.run(),因为事件循环已关闭。

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

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

【问题讨论】:

  • 重写分支向connect(从run 调用的协程之一)引入了一些重新连接逻辑。您可以尝试尽早切换到 rewrite 分支,看看是否会有所改善。

标签: python python-asyncio discord discord.py


【解决方案1】:

在互联网连接中断的情况下,现有的事件循环没有任何问题。只需不要调用关闭事件循环的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)

【讨论】:

    猜你喜欢
    • 2021-09-29
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    • 1970-01-01
    • 2020-10-02
    相关资源
    最近更新 更多