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)
我有一个 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)