在jobstore中找不到Python高级调度程序作业(apscheduler)

时间:2011-12-22 00:40:54

标签: python scheduler

考虑这段小代码

from apscheduler.scheduler import Scheduler
import time

class First():
    def __init__(self):
        self.remove_job=None
    def go(self):
        self.remove_job('test')
class Sched():
    def __init__(self):
        self.sched = Scheduler()
        self.sched.add_interval_job(    self.execute,
                        seconds=1,
                        name = 'test'
                        )
    def execute(self):
        print "i'm alive"
    def remove_job(self,job):
        self.sched.print_jobs()
        self.sched.unschedule_job(job)

def main():
    first = First()
    sched = Sched()
    first.remove_job=sched.remove_job
    sched.sched.start()
    time.sleep(5)
    first.go()
    return 0

if __name__ == '__main__':
    main()

python sched_test.py 
i'm alive
i'm alive
i'm alive
i'm alive
i'm alive
Jobstore default:
    test (trigger: interval[0:00:01], next run at: 2011-12-22 01:25:36.577572)
Traceback (most recent call last):
  File "sched_test.py", line 55, in <module>
    main()
  File "sched_test.py", line 51, in main
    first.go()
  File "sched_test.py", line 31, in go
    self.remove_job('test')
  File "sched_test.py", line 43, in remove_job
    self.sched.unschedule_job(job)
  File "/usr/local/lib/python2.7/dist-packages/APScheduler-2.0.2-py2.7.egg/apscheduler/scheduler.py", line 401, in unschedule_job
    raise KeyError('Job "%s" is not scheduled in any job store' % job)
KeyError: 'Job "test" is not scheduled in any job store'

为什么在打印作业时出现此错误? print_jobs()虽然给了我正确的概述。

有人可以解释这个问题吗?

3 个答案:

答案 0 :(得分:3)

对于大多数人来说这可能是显而易见的,但我花了一段时间才得到它。想要分享使我的代码工作的原因:

myJobName= "Homework"

for job in self.sched.get_jobs():
    if job.name == "Homework":
        self.sched.unschedule_job(job)
        print "No more homework!"

答案 1 :(得分:1)

您必须将作业实例(由add_interval_job返回)传递给unschedule_job而不是字符串。 这解决了这个问题。

答案 2 :(得分:0)

请注意,您的First类实际上并不拥有 sched个实例;它当然无法访问您可能想要操纵的sched.sched Scheduler实例。

class First():
    def __init__(self):
        self.remove_job=None
    def go(self):
        self.remove_job('test')

也许你应该首先构造Sched对象,这样你就可以将它传递给First()构造函数,这样你就可以调用它。我将草拟一个未经测试的机制,我认为可以解决这个问题:

class First():
    def __init__(self, sched):
        self.sched = sched
    def go(self):
        self.sched.remove_job('test')
def main():
    sched = Sched()
    first = First(sched)
    sched.sched.start()
    time.sleep(5)
    first.go()
    return 0

这样可以保持Sched级别 - 可以通过合并FirstSched来找到更清晰的设计 - First知道名称Sched控制的工作表明事情不太正确。

也许退后一步,解释一下你要解决的问题?这不是最干净的解决方案,所以我不得不怀疑你所遇到的问题是否可以通过更好的机制来解决。