Blog icon indicating copy to clipboard operation
Blog copied to clipboard

使用apscheduler的一个坑

Open zj1244 opened this issue 5 years ago • 0 comments

起因

之前使用apscheduler+flask跑定时任务,刚开始一段时间内一切正常,后来某天查看定时任务的时候,发现任务消失了,这让人感到非常困惑。

原因

之后加了大量logging记录日志,发现了一个错误:

[2019-12-12 Thursday 15:00] [INFO] Scheduler started
[2019-12-12 Thursday 15:00] [DEBUG] Looking for jobs to run
[2019-12-12 Thursday 15:00] [ERROR] Unable to restore job "test_job" -- removing it
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/apscheduler/jobstores/mongodb.py", line 128, in _get_jobs
    jobs.append(self._reconstitute_job(document['job_state']))
  File "/usr/local/lib/python2.7/site-packages/apscheduler/jobstores/mongodb.py", line 117, in _reconstitute_job
    job.__setstate__(job_state)
  File "/usr/local/lib/python2.7/site-packages/apscheduler/job.py", line 272, in __setstate__
    self.func = ref_to_obj(self.func_ref)
  File "/usr/local/lib/python2.7/site-packages/apscheduler/util.py", line 305, in ref_to_obj
    raise LookupError('Error resolving reference %s: could not import module' % ref)
LookupError: Error resolving reference jobs:job1: could not import module
[2019-12-12 Thursday 15:00] [DEBUG] Next wakeup is due at 2019-12-13 08:21:05.380000+08:00 (in 62419.929130 seconds)
[2019-12-12 Thursday 15:00] [INFO]  * Running on http://0.0.0.0:8088/ (Press CTRL+C to quit)

从错误信息看到,因为无法还原job,然后把它删了。。。。。。那为什么还原job呢?我查看数据库发现有这个job呀,为什么不能还原?而且不单单有这个job,还有其他程序调用apscheduler添加的job。接着查看调试信息的时候发现一个奇怪的情况,数据库里有A程序调用aps添加的任务1,应执行的时间是a1。还有B程序调用aps添加的任务2,应执行的时间的b2。但现在在A程序上的调试信息里看到的时间确是b2,后来想了想,出现这种情况可能是因为任务1和任务2都在一个库的一个表里,所以导致A程序调用了任务2,然后调用失败删除了相应的job。

解决

网上所有教程和相关问题都没说过这种情况,相关示例也没有说可以自定义job库和表,所以出现了一个程序使用aps的时候没有问题,但是两个程序都使用的时候出现了问题,解决方法就是一个程序使用一个表就可以了,如下: image

zj1244 avatar Dec 12 '19 08:12 zj1244