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
相关产品推荐
相关产品推荐

