1. Dyadya Zed

    11.10.2008 00:23

    Здравствуйте!

    Пишу почтовую рассылку на Джанге (не спам), нужно сделать 2 долгоиграющих процесса - генерация сообщений и отправка.

    Как лучше это сделать? Пока что мои процессы отваливаются по таймауту.

    Допустим, можно запустить еще один процесс, как его сделать независимым от таймаута браузера? Чем его запускать, popen, exec?

    Помогите, кто сталкивался, нужно срочно сделать, а времени на эксперименты нет.

    Спасибо
  2. Иван Сагалаев

    11.10.2008 00:31

    Обычно это просто делают вообще без участия веба — по cron'у или вечноживущим отдельнымпроцессом. Вебная часть записывает в очередь, что надо разослать, а отдельный процесс ее разгребает.

  3. Dyadya Zed

    11.10.2008 00:50

    Да, я помню старый тред в этом форуме. Вопрос был очень похожим, равно как и ответ :)

    Меня сейчас больше интересует практический аспект. Как в python сделать отдельный вечноживущий процесс, с джанговским окружением?

    Можно ли через запуск popen добавить задание в крон? Например у меня нет сообщений на отправку, соответственно к кроне нет заданий. Появились сообщения - добавилось задание крона (хочу реализовать отправку мгновенную и отложенную - через минуту, например, или в четко заданное время).
  4. Иван Сагалаев

    11.10.2008 01:03

    Это два разных вопроса...

    1. Вечный процесс — это просто питонья программа, которая может или просыпаться раз в минуту, или слушать сигналы через какую-нибудь межпроцессную очередь (stompserver, 0mq, beanstalkd, simple-thrift-queue — это дико модно, кстати :-) ) или через сокет. Создать в ней джанговское окружение очень просто:

      import settings
      from django.core.management import setup_environ
      setup_environ(settings)
      

      А можно еще реализовать это джанговской командой и запускать через ./manage.py ..., тогда окружение в ней будет сразу.

    2. В крон динамически ничего не добавляют обычно. Он просто раз в какое-то время запускает скрипт, который что-то делает. Фактически, крон и есть такой вот уже написанный процесс из первого пункта, но он, правда, мгновенно реагировать ни на что не будет.

  5. Олег Волчков

    11.10.2008 15:55

    Буквально вчера нашел достаточно удобный сниппет для запуска Джанговоского окружения из консольного скрипта - http://www.djangosnippets.org/snippets/374/
  6. Иван Сагалаев

    11.10.2008 16:46

    Это, кажется, очень старый какой-то способ. Тех трех строчек, что я привел вышел, вполне достаточно.

  7. Олег Волчков

    11.10.2008 17:27

    Не достаточно. В сниппете перед вызовом setup_environ дополнительно настраиваются переменные окружения, чтобы можно было найти settings.py (да и остальные модули проекта тоже).
  8. Олег Волчков

    11.10.2008 17:32

    Собственно команда для manage.py более красивое решение, но не всегда хочется с этим возиться. :)
  9. Dyadya Zed

    11.10.2008 20:07

    я нашел еще django-extensions http://code.google.com/p/django-command-extensions/

    видимо, это и есть реализованная команда для manage.py о которой так долго говорили большевики :)
  10. +1 за django-command-extensions.

    С ним просто пишутся задачи для крона. Остается только запустить, как:

    0 * * * * /home/user/project/manage.py runjobs hourly

    Это пример крона, запускающегося раз в час.
  11. Вася Триллер

    13.10.2008 23:58

    или слушать сигналы через какую-нибудь межпроцессную очередь или через сокет.

    А ещё забыли про D-Bus и иже с ним :)

bbcode