Discord.py脚本执行完毕后出现'Unclosed connector'警告,求解决指引
解决discord.py脚本结束时的"Unclosed connector"警告
问题详情
脚本连接Discord后立即断开,能正常输出:
**** Logged in!
**** End
但脚本结束时会弹出额外警告:
Unclosed connector
connections:
['[(<aiohttp.client_proto.ResponseHandler object at 0x7f18f84e6080>,
3702249.404694462)]']
connector: <aiohttp.connector.TCPConnector object at 0x7f18f70af4c0>
希望妥善处理该警告,而非忽略。
已尝试的解决思路
以下是最小复现代码,我已经试过这些方法但无效:
- 定义
aiohttp.ClientSession()并等待其关闭 - 利用
@client.event的on_disconnect()事件关闭session - 用
bot.run替代client.run,甚至放入异步运行逻辑中 - 添加延迟sleep,观察连接是否会在脚本结束前关闭
- 查阅Discord官方示例
- 研究Stack Overflow上的类似帖子并尝试适配场景
最小复现代码
import discord import asyncio # 屏蔽discord的登录日志 import logging logging.getLogger("discord.client").setLevel(logging.WARNING) logging.getLogger("discord.gateway").setLevel(logging.WARNING) intents = discord.Intents.default() client = discord.Client(intents=intents) @client.event async def on_ready(): print('**** Logged in!') await client.close() # 启动脚本 DISCORD_BOT_TOKEN = 'xxx' if __name__ == '__main__': client.run(DISCORD_BOT_TOKEN) print('**** End')
解决方案
问题出在client.run()是同步阻塞调用,它内部创建并管理aiohttp的connector,但在on_ready里直接await client.close()时,可能存在connector未完全关闭就退出事件循环的情况。正确做法是用异步方式启动客户端,确保事件循环正常关闭所有资源。
修改后的代码如下:
import discord import asyncio import logging # 屏蔽discord的登录日志 logging.getLogger("discord.client").setLevel(logging.WARNING) logging.getLogger("discord.gateway").setLevel(logging.WARNING) intents = discord.Intents.default() client = discord.Client(intents=intents) @client.event async def on_ready(): print('**** Logged in!') await client.close() async def main(): DISCORD_BOT_TOKEN = 'xxx' async with client: await client.start(DISCORD_BOT_TOKEN) if __name__ == '__main__': asyncio.run(main()) print('**** End')
说明
- 使用
async with client上下文管理器,自动处理客户端的启动和关闭,确保所有底层资源(包括aiohttp的connector)被正确释放。 - 用
client.start()替代client.run(),client.run()内部封装了事件循环的启动和关闭,但在快速启动关闭的场景下易出现资源未清理问题;client.start()是异步方法,配合上下文管理器能更精细控制资源生命周期。 - 通过
asyncio.run()运行异步的main函数,它会负责创建和关闭事件循环,确保所有异步任务完成后资源被正确回收。
修改后脚本运行结束就不会再出现"Unclosed connector"警告。
内容的提问来源于stack exchange,提问作者ManiMatter
相关产品推荐
相关产品推荐

