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

Discord.py多次调用发送消息函数报错或无消息输出如何解决?

问题根源分析
  • 最初的同步版本问题:client.run()是阻塞方法,第一次调用会完全占用当前线程的事件循环,直到客户端关闭才会返回,所以第二次调用永远无法正常执行,还会触发事件循环冲突的告警。
  • 改异步后的版本问题:asyncio.ensure_future()只是把任务提交到当前事件循环,没有等待任务执行完成的逻辑,主脚本提交完任务就直接退出了,所以消息根本没来得及发送;同时每次调用都新建Client实例也会产生不必要的连接开销和事件循环冲突。
正确实现方案

核心思路是复用同一个Client实例,先批量收集要发送的消息,再统一启动客户端完成发送,避免多次连接冲突。

import asyncio
import discord

TOKEN = "你的机器人TOKEN"
USER_ID = 1234567890 # 替换为实际目标用户ID
# 存储待发送的消息队列
message_queue = []

def send_something(message):
    # 仅将消息加入队列,无阻塞逻辑,可随意调用多次
    message_queue.append(message)

async def main():
    # 声明所需权限,注意需要同步在Discord开发者后台开启对应权限
    client = discord.Client(intents=discord.Intents.default())
    
    @client.event
    async def on_ready():
        # 批量发送队列内所有消息
        connection = await client.fetch_user(USER_ID)
        for msg in message_queue:
            await connection.send(msg)
        # 发完后关闭客户端
        await client.close()
    
    # 异步启动客户端
    async with client:
        await client.start(TOKEN)

# 先多次调用添加要发送的消息
send_something('first')
send_something('second')

# 最后统一运行事件循环,等待所有发送任务完成
asyncio.run(main())

如果需要服务长期运行、随时触发消息发送,可以把消息队列换成异步队列,启动常驻消费循环,不需要每次发完就关闭客户端即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 13:00:02