考虑这段小代码
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()
虽然给了我正确的概述。
有人可以解释这个问题吗?
答案 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
级别 - 可以通过合并First
和Sched
来找到更清晰的设计 - First
知道名称Sched
控制的工作表明事情不太正确。
也许退后一步,解释一下你要解决的问题?这不是最干净的解决方案,所以我不得不怀疑你所遇到的问题是否可以通过更好的机制来解决。