Как я могу запустить фоновый процесс в Pylons? - PullRequest
3 голосов
/ 25 июля 2009

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

  1. Каков наилучший способ запуска фонового процесса, такого как этот, с контроллером Pylons?

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

Ответы [ 2 ]

6 голосов
/ 27 июля 2009

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

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

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

1 голос
/ 25 июля 2009

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

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

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

...