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

Flask调度器实现每小时随机分钟执行任务的问题求助

Flask调度器实现每次随机秒数执行任务的问题求助

嘿,各位大佬,我碰到个APScheduler的小问题,想请大家帮忙看看:

我写了一段Flask里用调度器的代码,本意是想让任务每分钟执行一次,但每次的执行秒数是随机的,结果现在的情况是,第一次随机选了一个秒数(比如10秒)之后,后面每次都固定在这个秒数执行,根本不会重新随机。我的代码是这样的:

scheduler.add_job(id='my_job1',
                  func=my_job,
                  trigger='cron',
                  second=str(random.randint(1,59)),
                  minute='*',
                  hour='*',
                  args=[app])
scheduler.init_app(app)
scheduler.start()

我试了好几次,每次都是第一次随机的秒数被固定下来,完全达不到每次随机的效果,有没有大佬知道该怎么改呀?


问题原因分析

其实问题很好理解:咱们写的str(random.randint(1,59))这部分代码,是在添加任务的瞬间就执行完毕了,生成了一个固定的字符串(比如'10'),之后调度器就一直用这个固定值作为触发的秒数,自然不会再重新随机啦。

解决办法

方法一:给cron触发器传一个生成随机秒数的函数

APScheduler的cron触发器支持直接传一个可调用函数作为字段值,每次需要计算下一次触发时间的时候,都会调用这个函数生成新的数值。咱们可以这么改:

import random

def get_random_second():
    # 每次调用都返回一个新的随机秒数字符串
    return str(random.randint(1,59))

# 添加任务的时候,直接把函数传进去,不要加括号调用!
scheduler.add_job(id='my_job1',
                  func=my_job,
                  trigger='cron',
                  second=get_random_second,
                  minute='*',
                  hour='*',
                  args=[app])
scheduler.init_app(app)
scheduler.start()

这样每次调度器要计算下一次什么时候触发,都会调用get_random_second()生成新的随机秒数,完美解决固定值的问题~

方法二:每次任务执行完后重新调度下一次

如果觉得方法一不够直观,咱们也可以换个思路:不用cron触发器,改用date触发器,每次任务执行完毕后,手动计算下一次的随机执行时间,再添加一个新的任务。代码大概是这样:

import random
from datetime import datetime, timedelta

def my_job(app):
    # 这里写你的任务逻辑
    print("任务执行中...")
    
    # 计算下一次执行时间:当前时间加1分钟,然后随机秒数
    next_run = datetime.now() + timedelta(minutes=1)
    next_run = next_run.replace(second=random.randint(1,59), microsecond=0)
    
    # 添加下一次的任务
    scheduler.add_job(id='my_job1',
                      func=my_job,
                      trigger='date',
                      run_date=next_run,
                      args=[app])

# 第一次启动时添加第一个任务
first_run = datetime.now().replace(second=random.randint(1,59), microsecond=0)
scheduler.add_job(id='my_job1',
                  func=my_job,
                  trigger='date',
                  run_date=first_run,
                  args=[app])
scheduler.init_app(app)
scheduler.start()

这个方法相当于每次任务跑完就“预约”下一次的随机时间,也能实现需求,就是代码稍微多一点~

备注:内容来源于stack exchange,提问作者Hadi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 13:12:57