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

如何在Discord.py Rewrite中等待指定时间且不暂停整个程序?

解决Discord机器人禁言后程序阻塞的问题

嘿兄弟,刚学第一天就踩这个异步的坑太正常啦!我给你用大白话讲明白~

为啥time.sleep()会把程序卡死?

你想啊,time.sleep()是Python自带的“强制休眠”,就像你在玩游戏的时候突然被强制暂停,啥都干不了。Discord机器人是异步运行的(简单说就是同时能处理好多请求,比如有人发消息、有人用命令),但time.sleep()会把整个机器人的进程都按住,这段时间里机器人完全没法响应任何其他命令或者消息,可不就卡死了嘛!

正确的做法:用异步休眠

discord.py搭配的asyncio库有个异步版的休眠——await asyncio.sleep(时长),这个就不一样了:它会让当前的禁言任务“暂停一会儿”,但机器人该干嘛干嘛,比如别人发命令、发消息都能正常处理,等时间到了再回来执行解除禁言的操作。

修改后的完整代码

首先要在代码顶部导入asyncio模块,然后替换掉原来的time.sleep:

import discord
import asyncio  # 新增:导入异步库

@client.command()
async def chatmute(ctx, user: discord.Member, *, time = 5):
    # 给用户加禁言角色
    mute_role = discord.utils.get(user.guild.roles, name="-")
    await user.add_roles(mute_role)
    # 移除普通成员角色
    member_role = discord.utils.get(user.guild.roles, name="Member")
    await user.remove_roles(member_role)
    
    await ctx.send(f'User has been chat muted.')
    
    # 这里换成异步休眠!
    await asyncio.sleep(time)
    
    # 解除禁言:加回普通角色
    await user.add_roles(member_role)
    await ctx.send(f'Your mute ran out, {user.mention}')

额外小提醒

  • time参数的单位是秒,如果要设置分钟的话,比如10分钟,就传600(10*60)就行
  • 要确保你的服务器里真的有叫"-"和"Member"的角色哦,不然机器人会找不到角色报错

内容的提问来源于stack exchange,提问作者epic the gamer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:02:55