使用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
相关产品推荐
相关产品推荐

