Задание расписания Django по таймауту - PullRequest
0 голосов
/ 10 июня 2011

У меня установлен тайм-аут для объекта в моей базе данных, и ему присвоено состояние (активное / законченное). Я хочу изменить состояние этой сущности на завершенное, когда истечет время ожидания. Я думал об использовании сельдерея для создания запланированной задачи с соответствующим тайм-аутом при создании объекта, что, в свою очередь, вызвало бы сигнал django, чтобы уведомить, что объект «истек», и после этого я установил бы значение в конец в обработчик сигнала. Тем не менее, это кажется чем-то вроде накладных расходов, и я думаю, что должен быть более прямой способ сделать это.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 12 июля 2011

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

Пример:

class TaskManager(models.Manager):
    def finished(self):
        return self.filter(finish__lte=datetime.datetime.now())

    def active(self):
        return self.filter(finish__gt=datetime.datetime.now())

class Task(models.Model):
    finish = models.DateTimeField()

    def is_finished(self):
        return self.finish <= datetime.datetime.now()
0 голосов
/ 11 июня 2011

Не обязательно легкий, но когда я столкнулся с этой проблемой, у меня было два решения.

Для начала я написал менеджер Django, который будет создавать набор запросов объектов, срок действия которых истек, а затем удалять их. Чтобы сделать это легче, я сохранил объекты «срок действия истекает» в их собственной таблице с отношением один к одному с фактическими объектами, и удалил эти события, которые они сделали, чтобы сохранить это столик маленький. Связь между объектом «истекает» и объектом, помеченным как «истек», вызывает попадание базы данных во вторую таблицу только тогда, когда вы разыменовываете поле ForeignKey, поэтому оно довольно легкое. Затем я буду вызывать этот управленческий вызов каждые 5 минут с помощью cron (диспетчер расписаний для Unix, если вы не знакомы с Unix). Это было нормально для каждого часа или около того.

Для более близких к второму тайм-аутам мое решение состояло в том, чтобы запустить отдельный сервер, который через вызовы REST из приложения Django получает уведомления о тайм-аутах. Он хранит отсортированный список того, когда должны были произойти таймауты, а затем вызывает вышеупомянутый управленческий вызов. Это в основном собственный планировщик с запланированными событиями, передаваемыми ему процессом Django. Чтобы сделать это дешево, я написал это с помощью Node.js.

Оба они работали. Работа cron намного проще.

...