2009-07-25 6 views
3

Я пытаюсь написать приложение, которое позволит пользователю запустить довольно продолжительный процесс (5-30 секунд). Затем он должен позволить пользователю проверить вывод процесса по мере его создания. Выход будет необходим только для текущего сеанса пользователя, поэтому ничего не нужно долго хранить. У меня есть два вопроса относительно того, как добиться этого, используя преимущества в рамках Пилоны:Как запустить фоновый процесс в Pylons?

  1. Что это лучший способ для запуска фонового процесса, такие как это с контроллером Пилоны?

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

Edit: Проблема заключается в том, если я запустить команду с помощью subprocess в контроллере, контроллер ожидает подпроцесс перед тем как продолжить, показывая пользователю пустую страницу, которая просто загружается, пока процесс не завершится. Я хочу, чтобы иметь возможность перенаправлять пользователя на страницу состояния сразу после запуска подпроцесса, позволяя ему выполнять самостоятельно.

ответ

6

Я занимался этой проблемой в прошлом (длительный процесс, вызванный через HTTP), с помощью моего вызванного второго процесса daemonize. Контроллер Pylons выполняет системный вызов вашего второго процесса (передавая любые данные), а второй процесс сразу становится демоном. Это завершает системный вызов, и ваш контроллер может вернуться.

Мои веб-приложения обычно затем выдают AJAX запросы на «проверку» процесса демона до его завершения. Я использовал оба файла tmp (cPickle хорошо работает) и базы данных для обмена информацией между демоном и веб-приложением.

Отличный рецепт питон демон: http://code.activestate.com/recipes/278731/

+0

Я сталкиваюсь с этой проблемой. Это безопасно? Что делать, если у вас 10000 пользователей каждую минуту? И большинство запросов очень дорого? Тогда у вас будет много демонов? Кроме того, вы предлагаете запустить процесс pylon daemon? Благодарю. – User007

+0

Это безопасно? Да, я уже много лет использую это в производственной среде. Просто убедитесь, что процесс вашего демона выходит из строя.На мой груз, вероятно, всего несколько десятков пользователей за * час *. В 10 000 пользователей в час - это какой-либо метод для запуска долговременного процесса, который будет безопасным? Может ли ваш сервер даже обрабатывать такое использование памяти/ЦП? Если вы не разблокировали второй процесс, может ли ваша настройка веб-сервера справиться с этим? – Mark

1

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

  • сгенерируйте идентификатор для нового задания и добавьте запись в базу данных.
  • создать новый процесс, например. через модуль подпроцесса и передать идентификатор в командной строке (*).
  • есть процесс записывает выходные данные на /tmp/project/ID
  • в пилонах, реализовать URL-адреса вида /job/ID или /job?id=ID. Это заглянет в базу данных, будет ли задание завершено или нет, и объедините временный вывод на страницу.

(*) Возможно, для подпроцесса может быть лучше создать другой процесс, и процесс пилонов будет ждать первого ребенка, так что не будет никаких процессов зомби.

+0

предсказуемые имена временных файлов часто небезопасны - они могут злоупотреблять перезаписать произвольные файлы, которые веб-сервер имеет доступ на запись. Я бы предложил использовать предварительно созданный (с соответствующими разрешениями) каталог под/var, скажем. –

Смежные вопросы