Демон для вызова функции каждые 2 минуты с возможностью запуска и остановки - PullRequest
1 голос
/ 17 июня 2010

Я работаю над веб-приложением django.

Функция 'xyx' (она обновляет переменную) должна вызываться каждые 2 минуты.

Я хочу, чтобы один http-запрос должен был запустить демон и продолжать вызывать xyz (каждые 2 минуты), пока я не отправлю еще один http-запрос, чтобы остановить его.

Цените ваши идеи.

Спасибо Вишал Рана

Ответы [ 3 ]

4 голосов
/ 17 июня 2010

Есть несколько способов добиться этого.Предполагая правильные ресурсы сервера, я бы написал скрипт на python, который вызывает функцию xyz «вне» вашего каталога django (хотя и импортирует необходимые вещи), которая запускается только при наличии /var/run/django-stuff/my-daemon.run.Заставьте cron запускать его каждые две минуты.

Затем для ваших функций django ваша функция запуска создает вышеупомянутый файл, если он еще не существует, а функция остановки уничтожает его.

Как я уже сказал, есть и другие способы добиться этого.Вы можете иметь скрипт Python в цикле, ожидающий около 2 минут ... и т. Д. В любом случае вы сталкиваетесь с тем фактом, что два скрипта Python выполняются по двум различным вызовам cpython (не знаю, так ли это с mod_wsgi) не может общаться друг с другом, и поэтому IPC между скриптами Python не прост, поэтому вам нужно использовать какой-то формальный IPC (например, семафоры, файлы и т. Д.), А не просто общие переменные (которые не будут работать).

2 голосов
/ 17 июня 2010

Если простые решения (цикл в скрипте, crontab, сообщаемый временным файлом) слишком хрупки для вашего предполагаемого использования, вы можете использовать Twisted средства для обработки процесса и планирование и сетевое . Ваше приложение Django (использующее клиент Twisted ) будет просто обмениваться данными через TCP (локально) с сервером Twisted.

2 голосов
/ 17 июня 2010

Возможно, немного взломан, но вы можете попробовать это:

Настройка записи crontab, которая запускает скрипт каждые две минуты. Этот сценарий проверит наличие какого-либо флага (наличие файла, содержимое файла и т. Д.) На диске, чтобы решить, запускать ли данный модуль python. Проблема в том, что запуск функции в первый раз после ее запуска может занять до 1:59.

Я думаю, что если вы запустите демон в функции view, он сохранит рабочий процесс httpd, а также соединение, если вы не поймете, как закрыть соединение, не прерывая функцию представления django. Это может быть очень плохо, если вы хотите делать это параллельно для разных пользователей. Кроме того, чтобы убить функцию таким способом, вам нужно каким-то образом знать, какой процесс python и / или httpd вы хотите уничтожить позже, чтобы не убить их всех.

Реальный способ сделать это - написать код реального демона на языке w / e и просто сделать системный вызов "/etc/init.d/daemon_name start" и "... stop" в представлениях django. , Для этого вам нужно убедиться, что у пользователя вашего веб-сервера есть разрешение на запуск демона.

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