使用Discord Python扩展的start()函数替代run()的实现方法
解决Discord机器人用
.start()启动时出现“Unclosed client sessions”的问题 我懂你的困惑!很多人入门Discord机器人时都是用.run(TOKEN)一键启动,它内部帮你封装了所有异步上下文的管理和资源清理。但当你想改用.start()来配合其他异步代码时,就得手动处理客户端的生命周期,不然就会出现你遇到的未关闭会话错误。
核心原因
.start()是一个异步方法,它不会像.run()那样自动处理事件循环的启动和客户端的关闭流程。如果直接调用它而没有正确的异步上下文管理,客户端会话就无法被正常关闭,从而触发“2 Unclosed client sessions”的报错。
正确的实现方式
你需要把.start()放在异步函数里,并用async with来管理客户端的生命周期(它会自动帮你处理启动和关闭),再通过asyncio.run()来运行这个异步函数。举个完整的例子:
import discord import asyncio # 配置机器人需要的intents,根据你的功能开启对应的权限 intents = discord.Intents.default() intents.message_content = True # 如果需要处理消息内容,必须开启这个 client = discord.Client(intents=intents) @client.event async def on_ready(): print(f"成功登录:{client.user.name}(ID:{client.user.id})") async def main(): # async with会自动管理client的启动和关闭,确保会话正确结束 async with client: await client.start("你的机器人TOKEN") if __name__ == "__main__": # 运行异步主函数 asyncio.run(main())
如果需要同时运行其他异步任务
如果你的机器人需要和其他异步代码(比如定时任务、API请求循环)一起运行,可以用asyncio.gather()把它们放在一起:
async def some_background_task(): while True: print("后台任务运行中...") await asyncio.sleep(60) async def main(): async with client: # 同时启动机器人和后台任务 await asyncio.gather( client.start("你的机器人TOKEN"), some_background_task() )
这样处理后,无论程序正常退出还是遇到异常,客户端会话都会被正确关闭,就不会再出现未关闭的报错啦。
内容的提问来源于stack exchange,提问作者EvilTaco
相关产品推荐
相关产品推荐

