У меня есть базовые проекты django, которые я использую в качестве интерфейса интерфейса для вычислительного кластера (Condor) для генерации симуляций. Из приложения django пользователи могут запускать симуляции (в Condor). Связанные с симуляцией метаданные и состояние симуляции хранятся в БД.
Мне нужно добавить новую функцию: уведомление, когда (некоторые) симуляции сделаны.
Поскольку я хочу простое решение (а я уже использую фоновые задачи), я подумал о том, чтобы использовать повторяющуюся задачу, которая через фиксированные промежутки времени запрашивает Condor о задачах, обновляет БД и при необходимости отправляет уведомления.
Так что если я хочу каждые 10 минут обновлять статусы, у меня будет что-то вроде:
@background(schedule=1)
def check_simulations(repeat=600):
# lookup simulation statuses
simulation_list = get_Simulations()
for sim in simulations_list:
if sim.status == Simulation.DONE:
user.email_user('Simulation Complete', 'You have been notified')
def initialize():
check_simulations()
Однако эта задача (или, точнее, метод initialize ()) должна быть запущена (вызвана один раз), чтобы создать и запланировать задачу check_simulations () (которая практически сериализует вызов и сохранит его в БД); после этого поток фоновых задач прочитает его и выполнит, а также перепланирует (если есть ошибка)
Мои вопросы:
- куда мне поместить вызов метода initialize (), который будет запущен только один раз?
Одним из таких мест может быть, например, urls.py, но это крайне уродливое решение. Есть ли лучший способ?
- как убедиться, что при перезапуске сервера не будет создано и запланировано новое задание (если оно уже существует)
Это может произойти, если задача уже запланирована (так что сериализованная задача находится в таблице фоновых задач), и веб-сервер перезапускается, поэтому метод initialize () вызывается снова, чтобы создать и запланировать новую задачу ...