0

我正在用 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)。

有没有其他人在这里提出解决方案?如果没有,我正在考虑在开发人员的网站上发布建议。

4

1 回答 1

2

As you've probably figured out by now, that phenomenon is caused by the job stores instantiating jobs on the fly based on data loaded from the back end. To run a copy of a job immediately, this should do the trick:

job = sched.get_job(id)
sched.add_job(job.func, args=job.args, kwargs=job.kwargs)
于 2014-08-21T08:53:15.960 回答