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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:14:21