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

如何在discord.py中实现任务循环的随机定时器?

动态修改discord.py任务循环间隔的实现

你猜的没错,tasks.loop的seconds参数是在装饰器初始化阶段就固定下来的,后续修改random_timer变量根本不会影响已经启动的循环间隔。要实现每次15-35秒的随机间隔且不用重启循环,可以用任务对象的change_interval()方法来动态更新间隔。

先修正你代码里的几个问题:

  • 不能直接用频道ID调用send,必须先通过Bot实例获取对应的频道对象
  • 随机间隔的逻辑要放到循环内部,每次执行完后更新下一次的间隔

以下是完整的可运行代码:

import random
import discord
from discord.ext import tasks, commands

# 初始化Bot,按需调整权限和前缀
bot = commands.Bot(command_prefix="!", intents=discord.Intents.default())

BASE_TIMER = 15
CHANNEL_ID = 108728307283
target_channel = None

@bot.event
async def on_ready():
    global target_channel
    target_channel = bot.get_channel(CHANNEL_ID)
    if target_channel:
        print(f"已连接到频道: {target_channel.name}")
        hello.start()
    else:
        print(f"无法找到ID为{CHANNEL_ID}的频道")

@tasks.loop(seconds=BASE_TIMER)  # 初始间隔设为基础值15秒
async def hello():
    if not target_channel:
        return
    await target_channel.send("Hello!")
    # 生成15-35秒之间的随机间隔
    next_delay = BASE_TIMER + random.randint(1, 20)
    # 动态修改下一次循环的间隔
    hello.change_interval(seconds=next_delay)

# 替换成你的Bot令牌
bot.run("YOUR_BOT_TOKEN")

关键逻辑说明

  • change_interval()是tasks.Loop对象的内置方法,调用后会直接更新下一次循环的等待时间,完全不需要停止或重启任务
  • 每次循环执行完毕后计算新的随机间隔,确保每次发送消息的间隔都在15-35秒的范围内
  • 先在on_ready事件中获取频道对象,避免循环执行时找不到频道的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 10:20:31