Задание планировщика Python Advanced не найдено в хранилище заданий (apscheduler) - PullRequest
1 голос
/ 22 декабря 2011

Рассмотрим этот маленький кусочек кода

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 ]

3 голосов
/ 12 сентября 2012

Это может быть очевидно для большинства людей, но мне потребовалось некоторое время, чтобы получить это. Хотел просто поделиться тем, что заставило мой код работать:

myJobName= "Homework"

for job in self.sched.get_jobs():
    if job.name == "Homework":
        self.sched.unschedule_job(job)
        print "No more homework!"
1 голос
/ 22 декабря 2011

вы должны передать экземпляр задания (возвращаемый add_interval_job) в unschedule_job вместо строки. Это решает проблему.

0 голосов
/ 22 декабря 2011

Обратите внимание, что ваш класс First на самом деле не имеет a 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, является признаком того, что что-то не так.

Возможно, сделайте шаг назад и объясните, в чем проблематы пытаешься решить?Это не самое чистое решение, поэтому мне интересно, можно ли решить возникшую проблему с помощью лучшего механизма.

...