【问题标题】:How do I gracefully handle Ctrl + C and shutdown Discord Py bot?如何优雅地处理 Ctrl + C 并关闭 Discord Py 机器人?
【发布时间】:2021-10-22 19:59:18
【问题描述】:

我正在使用 Discord.py 库来制作 python discord bot,并且在关闭或收到 SIGINIT 时我希望它运行关闭处理程序(更新数据库、关闭数据库连接等)我有主 python脚本以及我想彻底关闭的不和谐齿轮。一个简单的谷歌只是说使用 Try/Finally,并让它运行client.close(),但需要等待。所以它看起来像这样:

try:
    bot.run(config["token"])
finally:
    shutdownHandeler()
    bot.close() 

但它希望我 await bot.close 协程,除非它不在异步函数内,否则我不能这样做。我对 asyncio 和 discord py 还是很陌生,所以如果有人能指出我正确的方向,那就太棒了!提前感谢您的帮助。

【问题讨论】:

    标签: python discord.py python-asyncio


    【解决方案1】:

    run() 的问题是你不能只使用try - finally 来实现清理,因为在处理run() 的过程中,discord.py 已经与机器人本身一起关闭了事件循环.但是,在run() 清理的第一阶段,bot.close() 方法被调用。所以最好在那个 close 方法中运行你的清理操作:

    from discord.ext import commands
    
    
    class Bot(commands.Bot):
        async def async_cleanup(self):  # example cleanup function
            print("Cleaning up!")
    
        async def close(self):
            # do your cleanup here
            await self.async_cleanup()
            
            await super().close()  # don't forget this!
    
    
    bot = Bot(None)
    bot.run(TOKEN)
    

    【讨论】:

    • 酷!但是如果我使用 CTR + C 退出程序,我将如何调用async_cleanup 函数?
    • 当你 ctrl c 时,Dpy 会自动为你调用 close(),所以无论你在 close() 开头放置的任何代码都会运行,只是不要忘记最后的 super 调用。
    • 太棒了!我是否需要为 cogs 做任何不同的事情,或者每个 cog 在关机时也会调用自己的close() 函数?
    • Cogs 没有关闭方法,只有机器人有。如果你想让每个 cog 都有自己的关闭处理程序,你需要在你的机器人的主要关闭方法中实现它。
    【解决方案2】:

    为什么不在异步函数中声明 bot.close()shutdownHandeler(),然后在必要时调用它,在 finaly 或停止命令或其他任何你会想到的地方?

    【讨论】:

    猜你喜欢
    • 2018-01-10
    • 2017-12-31
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多