реализация таймера в приложении Django - PullRequest
2 голосов
/ 21 января 2010

В моем приложении Django мне нужно реализовать эту функцию «на основе таймера»:

  1. Пользователь создает несколько заданий и для каждого определяет, когда (в том же модуле таймер работает, вероятно, секунды) это состоится.
  2. Пользователь запускает таймер.
  3. Пользователь может приостановить и возобновить таймер, когда захочет.
  4. Задание выполняется, когда истекает его время.

Это не соответствует типичному сценарию cron, поскольку время выполнения привязано к таймеру, который пользователь может запустить, приостановить ирезюме.

Какой предпочтительный способ сделать это?

Ответы [ 5 ]

4 голосов
/ 21 января 2010

Это не вопрос Джанго. Это проблема системной архитектуры. Http не имеет состояния, поэтому нет понятия времени.

Я предлагаю использовать очереди сообщений, такие как RabbitMQ и использовать Carrot для взаимодействия с ним. Вы можете поместить задания в очередь, а затем создать отдельный потребительский демон, который будет обрабатывать задания из очереди. У потребителя есть логика о том, когда обрабатывать.

Если это слишком сложная система, возможно, взгляните на реализацию таймера в JS и вызов его URL-адреса, сопоставленного с представлением, которое обрабатывает единицу работы. JS будет таймером.

1 голос
/ 23 января 2010

Взгляните на Пинакс , особенно на уведомления.

После создания они помещаются в БД (очередь) и обрабатываются отправкой электронной почты cron-jobbed (2. потребитель).

В этом сенарио вы не остановите его, как только его уволят. Это может управляться представлениями som (ajax-), которые вызывают системный процесс ....

1010 * редактировать *

вместо cron-jobs вы могли бы использовать потребителя на основе витой информации:

  • запись заданий в БД с информацией о времени в БД

  • отправить запрос на потребление (или возобновление, приостановку ...) на витой сервер через сокет

  • делать все остальное в витых

0 голосов
/ 26 октября 2016

Вы всегда можете использовать клиентский таймер jquery, но не забудьте инициализировать таймер значением, которое передается из вашего бэкэнд-приложения, а также убедитесь, что конечный пользователь не редактировал время (редактирование путем проверки). Поэтому поместите время начала таймера (начальное значение таймера) и время окончания таймера или время паузы таймера в бэкэнд (сама БД).

Отслеживание продолжительности в бэкэнде и запуск задания (в вашем случае).

Надеюсь, это понятно.

0 голосов
/ 08 февраля 2010

Я использовал, вероятно, самый простой (самый грубый, более подходящий, я боюсь) подход: 1. Написал модель, показывающую текущую позицию и состояние счетчика (активен, приостановлен и т. Д.), 2. Задание django который увеличивает счетчик, если его состояние активно, 3. Запись в cron, которая выполняет задание каждую минуту.

Спасибо всем за ответы.

0 голосов
/ 22 января 2010

В итоге вы будете иметь отдельные (от веб-сервера) процессы для мониторинга очереди и выполнения заданий. Подумайте, как бы вы построили это без Django, используя инструменты командной строки для его управления. Используйте модели Django для доступа к базе данных.

Если у вас есть эта работа, слой на веб-интерфейсе (используя полный Django) для управления очередью и отчета о состоянии задания.

Я думаю, что если вы подойдете к этому так, проблема станет намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...