首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法还原作业- apscheduler,sqlalchemy

无法还原作业- apscheduler,sqlalchemy
EN

Stack Overflow用户
提问于 2019-04-26 21:53:30
回答 1查看 749关注 0票数 0

我正在尝试编写我自己的python flask应用程序来监控我服务器的硬盘驱动器。

但从现在开始,我在使用apscheduler的sqljobstore时遇到了麻烦。当服务器运行时,一切都很好。但在重启后,我无法访问web界面并获得以下输出:

代码语言:javascript
复制
Unable to restore job "refresh_disks" -- removing it
Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/apscheduler/util.py", line 289, in ref_to_obj
    obj = getattr(obj, name)
AttributeError: module 'dirkules.tasks' has no attribute 'refresh_disks'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/apscheduler/jobstores/sqlalchemy.py", line 141, in _get_jobs
    jobs.append(self._reconstitute_job(row.job_state))
  File "/usr/local/lib/python3.6/dist-packages/apscheduler/jobstores/sqlalchemy.py", line 128, in _reconstitute_job
    job.__setstate__(job_state)
  File "/usr/local/lib/python3.6/dist-packages/apscheduler/job.py", line 272, in __setstate__
    self.func = ref_to_obj(self.func_ref)
  File "/usr/local/lib/python3.6/dist-packages/apscheduler/util.py", line 292, in ref_to_obj
    raise LookupError('Error resolving reference %s: error looking up object' % ref)
LookupError: Error resolving reference dirkules.tasks:refresh_disks: error looking up object
[2019-04-26 15:46:39 +0200] [13296] [INFO] Shutting down: Master

这是我的config.py:

代码语言:javascript
复制
import os
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
#from apscheduler.jobstores.memory import MemoryJobStore

baseDir = os.path.abspath(os.path.dirname(__file__))

SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(baseDir, 'dirkules.db')
SQLALCHEMY_TRACK_MODIFICATIONS = False

# The SCHEDULER_JOB_DEFAULTS configuration is per job, that means each job can execute at most 3 threads at the same time.
# The SCHEDULER_EXECUTORS is a global configuration, in this case, only 1 thread will be used for all the jobs.
# I believe the best way for you is to use max_workers: 1 when running locally

SCHEDULER_JOBSTORES = {'default': SQLAlchemyJobStore(url='sqlite:///' + os.path.join(baseDir, 'dirkules.db'))}
#SCHEDULER_JOBSTORES = {'default': MemoryJobStore()}

SCHEDULER_EXECUTORS = {'default': {'type': 'threadpool', 'max_workers': 3}}

SCHEDULER_JOB_DEFAULTS = {'coalesce': False, 'max_instances': 1}

SCHEDULER_API_ENABLED = True

init.py:

代码语言:javascript
复制
import dirkules.config as config

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_apscheduler import APScheduler

app = Flask(__name__)
app.config.from_object(config)
db = SQLAlchemy(app)

import dirkules.models
db.create_all()
scheduler = APScheduler()
scheduler.init_app(app)
scheduler.start()


#@app.before_first_request
from dirkules import tasks


# from dirkules.models import Time
# from sqlalchemy.orm.exc import NoResultFound
#
# try:
#     Time.query.one()
# except NoResultFound:
#     db.session.add(Time("Drives"))
#     db.session.commit()

import dirkules.views

和tasks.py:

代码语言:javascript
复制
from dirkules import scheduler
import datetime
import dirkules.driveManagement.driveController as drico

@scheduler.task('interval', id='refresh_disks', seconds=10)
def refresh_disks():
    #drives = drico.getAllDrives()
    print("Drives refreshed")

希望你能帮助我!

EN

回答 1

Stack Overflow用户

发布于 2019-04-28 20:03:01

作为导入模块的副作用而启动调度程序被认为是不好的做法,也可能是属性查找失败的原因。然而,我必须看到一个简化的、更完整的例子来重现这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55869140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档