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

如何设置Discord bot同一时间仅允许一位用户使用(基于discord.Client)

解决方案

你可以通过asyncio提供的异步互斥锁实现单命令并发限制,完全兼容discord.Client的使用方式,无需切换依赖。

完整实现代码如下:

import discord
import asyncio

# 全局唯一的异步互斥锁实例
command_lock = asyncio.Lock()
# 请根据实际需求调整Intents,需要至少开启message_content才能读取消息内容
intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)

@client.event
async def on_message(message):
    # 过滤bot自身发送的消息,避免循环触发
    if message.author.bot:
        return
    
    if message.content == "!test":
        # 锁已被占用,说明有命令正在执行,直接拒绝当前请求
        if command_lock.locked():
            # 可选:给用户返回提示,不需要可以删除该行仅保留return
            await message.channel.send("当前命令正被其他用户使用,请稍后重试")
            return
        
        # 通过async with持有锁,执行完成后会自动释放,即使中间报错也不会出现死锁
        async with command_lock:
            await asyncio.sleep(15)
            # 修正原代码语法错误:感叹号移到字符串引号内部
            await message.channel.send("Hello world!")

client.run("替换为你的Bot Token")

关键逻辑说明

  • 全局唯一的asyncio.Lock实例可以保证同一时间只有一个协程能持有锁进入执行逻辑
  • 使用async with语法管理锁的生命周期,无需手动调用释放方法,避免异常导致锁永久占用的问题
  • 额外新增了过滤bot自身消息的逻辑,避免不必要的触发逻辑

注意:你需要在Discord开发者平台的Bot设置页面开启「Message Content Intent」权限,否则bot无法读取用户发送的消息内容,无法触发命令。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:15:04