如何修复discord.py中Tasks循环的无运行事件循环错误
解决Discord机器人的"no running event loop"错误
错误原因
你在Cog的__init__方法中直接调用了self.check_empty_channels.start(),此时Discord机器人的asyncio事件循环还未启动——事件循环是在bot.run()执行时才会创建并运行的,这就导致asyncio.create_task找不到可用的运行中循环,触发报错。同时因为任务没被正确调度,还出现了协程未被await的警告。
修复步骤
方案一:移至on_ready事件启动任务(推荐)
将启动定时任务的逻辑放到Cog的on_ready监听事件中,这个事件会在机器人成功登录、事件循环完全启动后触发,是启动后台任务的正确时机:
class MyCog(commands.Cog): def __init__(self, bot): self.bot = bot # 移除__init__里的start()调用 @commands.Cog.listener() async def on_ready(self): # 事件循环已运行,安全启动任务 self.check_empty_channels.start() # 主程序顺序保持:创建bot → 添加cog → 启动bot bot = commands.Bot(command_prefix="!", intents=discord.Intents.all()) bot.add_cog(MyCog(bot)) bot.run("你的机器人令牌")
方案二:手动指定事件循环(不推荐)
如果必须在初始化阶段设置任务,可以通过机器人自带的循环对象来创建任务,避免依赖全局循环:
class MyCog(commands.Cog): def __init__(self, bot): self.bot = bot # 使用bot的循环创建任务 self.bot.loop.create_task(self.check_empty_channels._loop())
注意:此方法跳过了tasks模块的内部校验逻辑,不如方案一稳定,仅作为临时替代。
额外检查点
- 确认
bot.run()是程序的最后一步操作,必须在所有Cog添加、配置完成后执行 - 检查你的定时任务装饰器是否正确,比如
@tasks.loop(seconds=30),且任务方法是async def定义的协程
内容的提问来源于stack exchange,提问作者Pro Giple
相关产品推荐
相关产品推荐

