【问题标题】:Python APSCheduler throwing exception after removing job删除作业后Python APSCheduler抛出异常
【发布时间】:2022-04-14 14:28:45
【问题描述】:

我正在 redis 中添加作业,并在作业完成后添加了一个事件处理程序。 在事件处理程序中,我正在返回值,基于该值我从作业商店中删除作业 ID。它被成功删除,但立即引发异常。

代码

from datetime import datetime
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.events import EVENT_JOB_EXECUTED
import logging
logging.basicConfig()

scheduler = BackgroundScheduler()
scheduler.add_jobstore('redis')
scheduler.start()

def tick():
    print('Tick! The time is: %s' % datetime.now())
    return 'success'

def removing_jobs(event):
    if event.retval == 'success':
        scheduler.remove_job(event.job_id)

scheduler.add_listener(removing_jobs, EVENT_JOB_EXECUTED)

try:
    count = 0 
    while True:
        count += 1
        time.sleep(10)
        job_ret = scheduler.add_job(tick, 'interval', id = str(count), seconds=10)
except (KeyboardInterrupt, SystemExit):
    scheduler.shutdown()

例外

Exception in thread APScheduler:
Traceback (most recent call last):
  File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.5/threading.py", line 862, in run
    self._target(*self._args, **self._kwargs)
  File "/.virtualenvs/py3/lib/python3.5/site-packages/apscheduler/schedulers/blocking.py", line 30, in _main_loop
    wait_seconds = self._process_jobs()
  File "/.virtualenvs/py3/lib/python3.5/site-packages/apscheduler/schedulers/base.py", line 995, in _process_jobs
    jobstore.update_job(job)
  File "/.virtualenvs/py3/lib/python3.5/site-packages/apscheduler/jobstores/redis.py", line 91, in update_job
    raise JobLookupError(job.id)
apscheduler.jobstores.base.JobLookupError: 'No job by the id of 1 was found'

【问题讨论】:

  • 我假设您的 Redis 是本地的,您可以在通过 redis-cli 检查时告诉我们吗? hget apscheduler.jobs 1(在这种情况下,考虑到您的作业 ID 为 1)或尝试 hgetall apscheduler.jobs,这可能是调度程序中的所有作业 ID。
  • 尝试将日志级别设置为调试并在此处添加日志信息:import logging logging.basicConfig() logging.getLogger('apscheduler').setLevel(logging.DEBUG)

标签: python apscheduler


【解决方案1】:

简而言之:您在处理作业时将其删除; 所以你应该在它的执行之外删除作业。

那是因为调度器不知道作业的执行会做什么;所以它启动tick 并将job 对象发送到redis jobstore 认为它将再次执行。在此之前,EVENT_JOB_LISTENER 启动 removing_jobs

问题在于,当redis'jobstore 获得更新其状态的作业时,它已被删除,因此它引发了JobLookupError

【讨论】:

    猜你喜欢
    • 2018-01-28
    • 1970-01-01
    • 2019-02-08
    • 2014-07-21
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多