2015-06-25 2 views
1

Я хотел бы запускать задания, но, поскольку они могут быть длинными, я хотел бы знать, насколько они были обработаны во время их выполнения. То есть, исполнитель будет регулярно возвращать свой прогресс, не прекращая работу, которую он выполняет. Я попытался сделать это с помощью APScheduler, но, похоже, планировщик может получать сообщения о событиях, такие как EVENT_JOB_EXECUTED или EVENT_JOB_ERROR.Получить обратную связь от запланированного задания во время обработки

Возможно ли получить информацию от исполнителя во время выполнения задания?

Заранее благодарен!

+0

Если есть большой цикл, вы можете повторить число, которое представляет ход вашей работы и распечатать ее. Или, если вы хотите что-то визуальное, вы можете использовать это слово как длину холста, который будет действовать как индикатор выполнения вашей работы. Я не знаю, можете ли вы сделать это с помощью модуля вместо создания холста (или печати), но этот способ работает, не добавляя много времени на ваши вычисления. – ysearka

+0

@ysearka: Как может исполнитель и планировщик получить доступ к одному номеру? Исполнитель обычно блокирует каждый объект, который разрешено изменять. Должен ли я создавать объект для каждого задания, которое может быть обновлено исполнителем и прочитано планировщиком, а затем попросить планировщика регулярно проверять этот номер или есть способ сообщить планировщику каждый раз, когда номер был обновлен ? – petibonum

+0

Это может помочь, если вы покажете минимальный рабочий демонстрационный код. [ask] – boardrider

ответ

0

Существует, я думаю, особой поддержки для этого в APScheduler. Это требование возникло для меня много раз, и лучшее решение будет зависеть именно от того, что вам нужно. Некоторые возможности:

Работа словарного статус

Самое простое решение было бы использовать простой словарь питона. Сделайте ключ ключом задания и значение любой требуемой информации о состоянии. Это решение работает лучше всего, если у вас есть только одна копия каждой работы, выполняемой одновременно (max_instances=1), конечно. Если вам нужна какая-то структура для вашей информации о статусе, я поклонник namedtuples для этого. Затем вы либо держите словарь как злую глобальную переменную, либо передаете ее в каждую функцию задания.

Есть некоторые недостатки. Информация о статусе будет оставаться в словаре навсегда, если вы не удалите ее. Если вы удалите его в конце задания, вы не сможете прочитать статус «заполненный заданием», и в противном случае вы должны убедиться, что все, что отслеживает статус, проверяет и очищает каждое задание. Это, конечно, не имеет большого значения, если у вас есть разумный размер заданий/ключей.

Пользовательские ДИКТ

Если вам нужны какие-то дополнительные функции, вы можете сделать, как указано выше, но подкласс ДИКТ (или UserDict или MutableMapping, depending on what you want).

Memcached

Если у вас есть Memcached сервер, который вы можете использовать, хранить отчеты о состоянии в Memcached прекрасно работает, так как они могут истечь автоматически, и они должны быть глобально доступным для вашего приложения. Один из незначительных недостатков заключается в том, что информация о статусе может быть выведена с сервера memcached, если у него закончилась нехватка памяти, поэтому вы не можете гарантировать, что информация будет доступна.

Более серьезным недостатком является то, что для этого требуется наличие сервера memcached. Если у вас может быть или нет один доступный, вы можете использовать dogpile.cache и выбрать подходящий на тот момент бэкэнд.

Что-то еще

Pieter Комментарий об использовании функции обратного вызова стоит принять к сведению. Если вы знаете, какая информация о статусе вам понадобится, но вы не знаете, как вы ее сохраните или используете, передача обертки на ваши задания упростит использование другого бэкэнда позже.

Как всегда, будьте осторожны с чрезмерной разработкой своего решения. Если все, что вам нужно, это отчет, в котором говорится, что обработано 20/133 элементов, достаточно простого словаря.