Как интегрировать 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"). Если вы можете сделать это, вы можете избежать этой проблемы.