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

如何修复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 00:05:01