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

discord.py 批量锁定服务器全频道命令运行耗时过长问题求助

问题根因

你当前的实现是串行执行API请求:send_m函数的for循环中每次await c.set_permissions(...)都会阻塞等待Discord API返回结果后才会处理下一个频道,总耗时等于所有单频道请求耗时的总和,自然会随频道数量增长线性变长。你之前只是把逻辑封装为异步函数但没有修改串行等待的逻辑,所以不会有提速效果。

优化方案

用asyncio.gather并发执行所有需要发送的API请求,同时通过信号量asyncio.Semaphore控制并发数,避免触发Discord的速率限制。另外可以提前过滤掉不需要修改权限的频道,减少不必要的API调用。

修改后的参考代码如下:

import asyncio

# 并发请求限制,可根据实际情况调整,建议不要超过20避免触发限流
CONCURRENCY_LIMIT = 10

async def send_m(self, ctx, check: bool):
    semaphore = asyncio.Semaphore(CONCURRENCY_LIMIT)
    default_role = ctx.guild.default_role
    
    # 单个频道权限修改的包装函数,加并发控制和错误捕获
    async def modify_channel_perm(channel):
        async with semaphore:
            try:
                if channel.overwrites_for(default_role).send_messages != check:
                    await channel.set_permissions(default_role, send_messages=check)
            except Exception as e:
                # 可根据需要调整错误处理逻辑,单个频道修改失败不影响其他频道
                print(f"修改频道 {channel.name} 权限失败: {str(e)}")
    
    # 收集所有需要执行的协程
    tasks = [modify_channel_perm(c) for c in ctx.guild.text_channels]
    # 并发执行所有任务
    await asyncio.gather(*tasks)
注意事项
  • 不要将CONCURRENCY_LIMIT设得过高,Discord API对同一服务器的批量修改请求有速率限制,过高的并发会触发自动重试反而拖慢速度,甚至导致请求被拒绝。
  • 如果服务器频道数量超过500,建议拆分批量操作为多批次执行,避免一次性发送过多请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:39:03