Python Advanced Scheduler运行时动态调整时间间隔不生效问题咨询
问题根源
你调用sched.add_job()传入seconds参数时,仅将调用时刻manager.model_retrain_freq的数值静态传入了任务配置,后续修改Manager类的属性不会自动同步到已创建的调度任务中,因此间隔不会更新。
解决方法
方法1:修改属性时主动更新调度任务的触发器
这种方法无需重建任务,直接修改已有任务的运行间隔,性能损耗最小。
修改步骤
- 创建任务时指定唯一的
id,方便后续查找任务 - 让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
相关产品推荐
相关产品推荐

