Как запустить фоновый процесс в Pylons?

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

  1. Как лучше всего запустить такой фоновый процесс с помощью контроллера Pylons?

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

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


person Dave Forgac    schedule 25.07.2009    source источник


Ответы (2)


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

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

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

person Mark    schedule 27.07.2009
comment
Я сталкиваюсь с этой проблемой. Это безопасно? Что, если у вас есть 10000 пользователей каждую минуту? И большинство запросов очень дорогие? Тогда у вас будет много запущенных демонов? Кроме того, вы предлагаете запустить процесс daemon pylon? Благодаря. - person User007; 22.07.2012
comment
Это безопасно? Да, я использую это в производственной среде в течение многих лет. Просто убедитесь, что ваши процессы демона завершаются корректно. Моя нагрузка, вероятно, составляет всего пару десятков пользователей в час. При 10 000 пользователей в час будет ли безопасным какой-либо метод запуска долговременного процесса? Может ли ваш сервер справиться с таким использованием памяти/ЦП? Если бы вы не разветвляли второй процесс, могла бы ваша настройка веб-сервера справиться с этим? - person Mark; 22.07.2012

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

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

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

person Martin v. Löwis    schedule 25.07.2009
comment
Предсказуемые имена временных файлов часто небезопасны — ими можно злоупотреблять для перезаписи произвольных файлов, к которым у вашего веб-сервера есть доступ для записи. Я бы предложил использовать предварительно созданный (с соответствующими разрешениями) каталог, скажем, в /var. - person Marius Gedminas; 17.09.2009