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

