【问题标题】:How to integrate APScheduler and Imp?如何集成 APScheduler 和 Imp?
【发布时间】:2015-10-09 22:21:02
【问题描述】:

我已经构建了一个基于插件的应用程序,其中“插件”(python 模块)可以由 imp 加载,然后由 APScheduler 安排稍后执行,我能够成功集成它们,但我想在崩溃的情况下实现持久性或应用程序重新启动,所以我将默认内存作业存储更改为 SqlAlchemyJobStore,它在您第一次执行程序时运行良好:任务被加载、调度、保存在数据库中并在正确的时间执行。

问题是当我再次尝试加载应用程序时,我得到了这个回溯:

ERROR:apscheduler.jobstores.default:Unable to restore job "d3e0f0068df54d15986e9b7b6757f665" -- removing it
Traceback (most recent call last):
  File "/home/jesus/.local/lib/python2.7/site-packages/apscheduler/jobstores/sqlalchemy.py", line 126, in _get_jobs
jobs.append(self._reconstitute_job(row.job_state))
  File "/home/jesus/.local/lib/python2.7/site-packages/apscheduler/jobstores/sqlalchemy.py", line 114, in _reconstitute_job
job.__setstate__(job_state)
File "/home/jesus/.local/lib/python2.7/site-packages/apscheduler/job.py", line 228, in __setstate__
self.func = ref_to_obj(self.func_ref)
  File "/home/jesus/.local/lib/python2.7/site-packages/apscheduler/util.py", line 257, in ref_to_obj
raise LookupError('Error resolving reference %s: could not import module' % ref)
LookupError: Error resolving reference __init__:run: could not import module

所以很明显,再次尝试导入函数时出现问题

这是我的调度程序初始化:

    executors = {'default': ThreadPoolExecutor(5)}
    jobstores = {'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')}
    self.scheduler = BackgroundScheduler(executors = executors,jobstores=jobstores)

我有一个“测试”字典,其中包含应该加载的“插件”和一些参数,“load_plugin”使用 imp 通过它的名称加载插件。

for test,parameters in tests.items():
        if test in pluggins:
            module=load_plugin(pluggins[test])
            self.jobs[test]=self.scheduler.add_job(module.run,"interval",seconds=parameters["interval"],name=test)

知道如何处理重组工作吗?

【问题讨论】:

    标签: python scheduling python-import apscheduler imp


    【解决方案1】:

    模块名称的自动检测出现问题。很难说是什么,但另一种方法是手动为其提供正确的查找路径作为字符串(例如“package.module:function”)。如果你能做到这一点,你就可以避免这个问题。

    【讨论】:

    • 这确实解决了我的问题,但如何实现并不明显,为了完整起见,我将使用工作代码编辑您的答案。
    • 是的,这是模块错误..我在 app.py 中创建了一个名为回调的函数,该函数被传递给 add_job...它工作正常...但是当我重新启动应用程序...它找不到函数名...我的意思是我在调试时检查了 API...它以字典的形式获取 app.py 的所有方法,但没有回调...为什么?有什么帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 2019-05-03
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多