You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用discord.Bot调用.close()时出现未关闭客户端会话错误

解决discord.py调用close()出现Unclosed资源错误的方案

问题根源

discord.py的run()方法是阻塞式的封装函数,内部已经帮你处理了事件循环启动、资源初始化、关闭清理的完整流程。手动调用close()会和run()的内部逻辑冲突,导致会话、连接器等资源无法被正确释放,进而抛出Unclosed相关错误,甚至阻塞后续代码执行。

具体解决办法

  • 优先用stop()替代close()
    如果你是在run()启动的bot中需要关闭,直接调用bot_instance.stop()(或类里的self.stop())就行。stop()会触发run()内部的优雅关闭流程,自动完成会话、连接器的清理,不会报错。
    示例(命令触发关闭):

    @bot.command()
    async def shutdown(ctx):
        await ctx.send("正在关闭bot...")
        await bot.stop()
    
  • 手动管理事件循环(不用run())
    如果必须手动控制关闭逻辑(比如非命令场景下自动关闭),别用run(),改用start()配合asyncio.run()来管理事件循环,这样close()能正常工作:

    import asyncio
    import discord
    
    class CustomBot(discord.Bot):
        async def on_ready(self):
            print(f"已登录:{self.user}")
            # 模拟运行5秒后自动关闭
            await asyncio.sleep(5)
            await self.close()
    
    async def main():
        bot = CustomBot(intents=discord.Intents.default())
        await bot.start("你的机器人令牌")
    
    if __name__ == "__main__":
        asyncio.run(main())
    
  • 检查自定义异步资源
    如果自己额外创建了aiohttp会话、未完成的异步任务,这些资源没关闭会导致连接器无法释放,引发SSL错误。关闭bot前要确保所有自定义异步操作都已完成或被取消。

  • 升级discord.py版本
    旧版本可能存在资源清理的bug,把discord.py升级到最新稳定版(比如pip install -U discord.py),很多这类问题都已被修复。

内容的提问来源于stack exchange,提问作者Anon Anon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:19:57