Как восстановить критическое задание python после системного сбоя

Существует ли какая-либо библиотека Python, которая обеспечивала бы (общую) функциональность журналирования состояния задания и восстановления?

Вот мой вариант использования:

  1. данные, полученные для запуска задания
  2. задание начинает обрабатываться
  3. работа завершает обработку

Затем я хочу иметь возможность перезапустить задание после 1, если процесс прерывается / происходит сбой питания. Джобс будет записывать в файл журнала при запуске задания и помечать задание как выполненное, когда оно завершится. Таким образом, когда процесс запускается, он проверяет файл журнала на наличие незавершенных заданий и использует данные журнала для перезапуска незавершенных заданий, если они имеются. Итак, какие инструменты Python существуют для решения этой проблемы? (Или другие решения Python для обеспечения отказоустойчивости и восстановления для критически важных заданий, которые должны выполняться). Я знаю, что очередь заданий, такая как RabbitMQ, вполне подойдет для этого случая, но мне нужно решение, которому не нужна внешняя служба. Я выполнил поиск в PyPI по запросу "ведение журнала" и не получил многого. Итак, какие-либо решения? Похоже, что библиотека для этого была бы полезна, поскольку при использовании журнала возникает множество проблем, которые трудно решить правильно, но библиотека может справиться. (Например, многократная асинхронная запись, разделение и усечение файлов и т. д.)


person Garrett Motzner    schedule 22.04.2020    source источник
comment
Вы можете добавить угрозу, которая проверяет записи в журнале. Мы делаем что-то подобное, мы называем это логикой восстановления. В основном, все наши работы ведутся в том, что вы называете журналом. Существует отдельный поток, который обрабатывает задачи/работы в этом каталоге. Если задача/задание не выполняются, мы не удаляем их из каталога. У нас есть поток восстановления, который запускается каждые «x» секунд для повторной обработки любых неудачных заданий. Многопоточность очень проста в Python, и кажется, что у вас уже есть много бизнес-правил, поэтому, если это возможно для вашего варианта использования, я бы просто добавил несколько потоков.   -  person spyder1329    schedule 23.04.2020
comment
@ spyder1329 Имеет смысл, но не решает заявленную проблему записи в журнал и чтения из него (я уточню это в вопросе). Но есть много проблем, когда дело доходит до ведения журнала, особенно когда у вас может быть несколько асинхронных записей в журнал. Также такие вещи, как ротация файлов, количество файлов справа и т. д.   -  person Garrett Motzner    schedule 23.04.2020
comment
вы смотрели в log4python?   -  person spyder1329    schedule 23.04.2020
comment
@ spyder1329 spyder1329 это хорошая идея - использовать регистратор для ведения журнала, поскольку они в чем-то похожи ... Однако у большинства регистраторов нет механизма для отбрасывания конкретных завершенных журналов или усечения в зависимости от того, какие задания были выполнены. завершенный. В идеале я хотел бы использовать специальную библиотеку для ведения журнала. Но если бы вы могли привести пример того, как использовать регистратор для регистрации данных, это было бы здорово!   -  person Garrett Motzner    schedule 23.04.2020
comment
Я тоже с нетерпением жду ответа, но я бы больше доверял популярной и широко распространенной службе обмена сообщениями, чем специализированной библиотеке.   -  person VPfB    schedule 08.05.2020
comment
@VPfB Я бы тоже хотел, но в моем конкретном случае лучше использовать «встроенное» решение. Честно говоря, я очень удивлен, что это не более распространенная вещь.   -  person Garrett Motzner    schedule 08.05.2020


Ответы (1)


Я думаю, вы можете сделать это с помощью crontabs или APScheduler, я думаю, что у последнего есть все функции, которые вам нужны, но даже с помощью cron вы можете сделать что-то вроде:

1: запланировать процесс для запуска через определенный интервал

2: Процесс проверяет, есть ли запущенное задание или нет

3: если ни одно задание не запущено, запустите одно

4: задание продолжает работать и сохраняет состояние в диск/БД

5: если это не удается или завершается, шаг 3 будет продолжен.

APScheduler, вероятно, то, что вы ищете, их список функций обширен, и его также можно расширить. если он не соответствует вашим требованиям.

person Mohamed Belkheir    schedule 12.05.2020
comment
Я не думаю, что это правильное решение, потому что ни одно из них не фокусируется на хранении данных, чего я и хочу. Эти решения сосредоточены на выполнении задания, что в данном случае не является проблемой. Что не обрабатывается, так это устойчивость в случае катастрофического сбоя. И это то, что я хочу решить. Тем не менее, это наводит меня на мысль... SQLite может быть здесь хорошим решением. он обрабатывает подкачку, хранение и удаление и может стать хорошим файлом журнала... - person Garrett Motzner; 13.05.2020
comment
По сути, часть, которую мне нужно решить, - это в основном 4, сохранение на диск, без внешней службы. И эти инструменты используют другие сервисы, похоже. - person Garrett Motzner; 13.05.2020