Как интегрировать APScheduler и Imp?

Я создал приложение на основе плагинов, в котором "плагины" (модули 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)

Любая идея о том, как я могу справиться с восстановлением рабочих мест?

1 ответ

Решение

Что-то в автоматическом определении имени модуля идет не так. Трудно сказать, что, но альтернатива состоит в том, чтобы вручную указать правильный путь поиска в виде строки (например, "package.module:function"). Если вы можете сделать это, вы можете избежать этой проблемы.

Другие вопросы по тегам