Существует, я думаю, особой поддержки для этого в APScheduler. Это требование возникло для меня много раз, и лучшее решение будет зависеть именно от того, что вам нужно. Некоторые возможности:
Работа словарного статус
Самое простое решение было бы использовать простой словарь питона. Сделайте ключ ключом задания и значение любой требуемой информации о состоянии. Это решение работает лучше всего, если у вас есть только одна копия каждой работы, выполняемой одновременно (max_instances=1
), конечно. Если вам нужна какая-то структура для вашей информации о статусе, я поклонник namedtuples для этого. Затем вы либо держите словарь как злую глобальную переменную, либо передаете ее в каждую функцию задания.
Есть некоторые недостатки. Информация о статусе будет оставаться в словаре навсегда, если вы не удалите ее. Если вы удалите его в конце задания, вы не сможете прочитать статус «заполненный заданием», и в противном случае вы должны убедиться, что все, что отслеживает статус, проверяет и очищает каждое задание. Это, конечно, не имеет большого значения, если у вас есть разумный размер заданий/ключей.
Пользовательские ДИКТ
Если вам нужны какие-то дополнительные функции, вы можете сделать, как указано выше, но подкласс ДИКТ (или UserDict или MutableMapping, depending on what you want).
Memcached
Если у вас есть Memcached сервер, который вы можете использовать, хранить отчеты о состоянии в Memcached прекрасно работает, так как они могут истечь автоматически, и они должны быть глобально доступным для вашего приложения. Один из незначительных недостатков заключается в том, что информация о статусе может быть выведена с сервера memcached, если у него закончилась нехватка памяти, поэтому вы не можете гарантировать, что информация будет доступна.
Более серьезным недостатком является то, что для этого требуется наличие сервера memcached. Если у вас может быть или нет один доступный, вы можете использовать dogpile.cache и выбрать подходящий на тот момент бэкэнд.
Что-то еще
Pieter Комментарий об использовании функции обратного вызова стоит принять к сведению. Если вы знаете, какая информация о статусе вам понадобится, но вы не знаете, как вы ее сохраните или используете, передача обертки на ваши задания упростит использование другого бэкэнда позже.
Как всегда, будьте осторожны с чрезмерной разработкой своего решения. Если все, что вам нужно, это отчет, в котором говорится, что обработано 20/133 элементов, достаточно простого словаря.
Если есть большой цикл, вы можете повторить число, которое представляет ход вашей работы и распечатать ее. Или, если вы хотите что-то визуальное, вы можете использовать это слово как длину холста, который будет действовать как индикатор выполнения вашей работы. Я не знаю, можете ли вы сделать это с помощью модуля вместо создания холста (или печати), но этот способ работает, не добавляя много времени на ваши вычисления. – ysearka
@ysearka: Как может исполнитель и планировщик получить доступ к одному номеру? Исполнитель обычно блокирует каждый объект, который разрешено изменять. Должен ли я создавать объект для каждого задания, которое может быть обновлено исполнителем и прочитано планировщиком, а затем попросить планировщика регулярно проверять этот номер или есть способ сообщить планировщику каждый раз, когда номер был обновлен ? – petibonum
Это может помочь, если вы покажете минимальный рабочий демонстрационный код. [ask] – boardrider