我正在使用APScheduler(v3.0.0)编写一个数据库驱动的应用程序。特别是在开发期间,我发现自己经常想要命令预定的工作开始运行现在而不影响其后续计划。
当然可以在创造就业机会时这样做:
def dummy_job(arg):
pass
sched.add_job(dummy_job, trigger='interval', hours=3, args=(None,))
sched.add_job(dummy_job, trigger=None, args=(None,))
但是,如果我已经安排了一个带有间隔或日期触发器的作业......
>>> sched.print_jobs()
Jobstore default:
job1 (trigger: interval[3:00:00], next run at: 2014-08-19 18:56:48 PDT)
......似乎没有一种好方法可以告诉调度程序“制作一份将立即开始的这份工作的副本”。我已经尝试了sched.reschedule_job(trigger=None)
,它会安排作业立即开始,但是会删除现有的触发器。
在保留其args
和任何其他有状态属性的同时,也没有明显,简单的方法来复制作业对象。我想象的界面是这样的:
sched.dup_job(id='job1', new_id='job2')
sched.reschedule_job('job2', trigger=None)
显然,APScheduler已经包含一个复制作业对象的内部机制,因为重复调用get_job
不会返回相同的对象(即(sched.get_job(id) is sched.get_job(id))==False
)。
有没有其他人在这里提出解决方案?我想在开发者网站上发布一个建议,如果没有。
答案 0 :(得分:2)
正如您现在可能已经想到的那样,这种现象是由作业库根据后端加载的数据动态实例化作业引起的。要立即运行作业的副本,这应该可以解决问题:
job = sched.get_job(id)
sched.add_job(job.func, args=job.args, kwargs=job.kwargs)