如何在APScheduler中访问并修改已暂停任务的原始next_run_time?
如何在APScheduler中访问并修改已暂停任务的原始next_run_time?
我来帮你解决这个问题~从你的示例代码和输出来看,APScheduler在处理暂停/恢复的date触发器任务时,确实会保留原始的触发时间,但默认没有直接通过next_run_time暴露给你随时访问,不过我们有两种靠谱的方式来获取和修改它:
方法一:直接从date触发器中提取原始时间
对于你使用的date类型触发器,APScheduler会把你当初设置的原始执行时间存在触发器的run_date属性里,这个值不会因为任务暂停、恢复或者原始时间过期而改变。
你可以直接在代码里访问这个属性,比如在暂停任务后添加一行:
print("[ORIGINAL] Original run time:", job.trigger.run_date)
对应到你的示例代码,不管什么时候调用,这个值就是你当初设置的datetime.now() + timedelta(seconds=10)的那个时间点。如果需要修改任务的执行时间再恢复,你可以基于这个原始时间调整:
# 比如把执行时间延迟30秒 new_run_time = job.trigger.run_date + timedelta(seconds=30) job.next_run_time = new_run_time job.resume()
方法二:手动存储原始时间(通用方案)
如果你的任务可能用到其他类型的触发器(比如interval、cron),或者你想更稳妥地控制这个原始时间,最好的办法是在创建任务时,手动给任务对象添加一个自定义属性来存储原始时间:
修改你添加任务的代码部分:
# 先定义原始执行时间 original_run_time = datetime.now() + timedelta(seconds=10) job = scheduler.add_job( func=do_stuff, trigger="date", next_run_time=original_run_time, misfire_grace_time=None, max_instances=10, ) # 手动给任务添加自定义属性,保存原始时间 job.original_run_time = original_run_time
这样之后,不管任务经历了多少次暂停、恢复,你都能随时通过job.original_run_time拿到最初设置的时间,然后自由修改:
# 等待原始时间过期后,修改为延迟1分钟执行 job.next_run_time = job.original_run_time + timedelta(minutes=1) job.resume() print("[UPDATED] New next run time:", job.next_run_time)
验证效果
把这两种方法结合到你的示例代码里,运行后就能看到:即使任务暂停过、原始时间已经过期,你依然能拿到最初设置的时间,并且可以修改后再恢复任务。
备注:内容来源于stack exchange,提问作者jda5
相关产品推荐
相关产品推荐

