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

Python Advanced Scheduler运行时动态调整时间间隔不生效问题咨询

问题根源

你调用sched.add_job()传入seconds参数时,仅将调用时刻manager.model_retrain_freq的数值静态传入了任务配置,后续修改Manager类的属性不会自动同步到已创建的调度任务中,因此间隔不会更新。

解决方法

方法1:修改属性时主动更新调度任务的触发器

这种方法无需重建任务,直接修改已有任务的运行间隔,性能损耗最小。

修改步骤

  1. 创建任务时指定唯一的id,方便后续查找任务
  2. 让Manager实例可以访问到调度器对象,在model_retrain_freq的setter方法中主动更新任务触发器

代码示例

修改后的run.py

from apscheduler.schedulers.background import BackgroundScheduler
import atexit

from app.main.manager import Manager

sched = BackgroundScheduler(daemon=True)
manager = Manager(scheduler=sched) # 把调度器传入Manager实例

sched.add_job(
    manager.model_expiry_callback,
    "interval",
    seconds=manager.model_retrain_freq,
    id="model_retrain_job" # 指定唯一任务ID
)
sched.start()
atexit.register(lambda: sched.shutdown(wait=False))

# testing
import time

time.sleep(10)
manager.model_retrain_freq = 1 # 修改后间隔会自动更新

time.sleep(9000)

修改后的manager.py

from apscheduler.triggers.interval import IntervalTrigger

class Manager:
    def __init__(self, scheduler):
        self._model_retrain_freq = 5
        self.scheduler = scheduler # 保存调度器引用

    @property
    def model_retrain_freq(self):
        """Get model retrain frequency"""
        return self._model_retrain_freq

    @model_retrain_freq.setter
    def model_retrain_freq(self, value):
        """Set model retrain frequency"""
        self._model_retrain_freq = value
        # 找到对应任务,更新触发器
        job = self.scheduler.get_job("model_retrain_job")
        if job:
            job.reschedule(trigger=IntervalTrigger(seconds=value))

方法2:删除旧任务重建新任务

这种方法逻辑更简单,无需导入触发器类,适合任务配置比较简单的场景。

代码示例(setter修改逻辑)

@model_retrain_freq.setter
def model_retrain_freq(self, value):
    """Set model retrain frequency"""
    self._model_retrain_freq = value
    # 先删除旧任务
    self.scheduler.remove_job("model_retrain_job")
    # 重新添加新任务
    self.scheduler.add_job(
        self.model_expiry_callback,
        "interval",
        seconds=value,
        id="model_retrain_job"
    )
注意事项
  • 操作调度器任务时要确保调度器处于运行状态,不要在调度器启动前修改任务配置
  • 如果是多进程场景下使用APScheduler,需要使用分布式的任务存储(比如Redis、SQLAlchemy),才能保证修改在进程间同步生效

内容的提问来源于stack exchange,提问作者Its Andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 18:57:03