Асинхронные фоновые процессы с web2py - PullRequest
8 голосов
/ 29 декабря 2011

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

Мой конкретный вариант использования - вызвать процесс через stdlib.subprocess и ждатьдля его выхода без блокировки веб-сервера, но я открыт для альтернативных методов.

  • Практические примеры были бы плюсом.
  • Рекомендации сторонних библиотек приветствуются.
  • Планирование CRON не требуется / не требуется.

Ответы [ 3 ]

7 голосов
/ 29 декабря 2011

Предполагая, что вам нужно запустить несколько, возможно, одновременных, экземпляров фоновой задачи, решение представляет собой очередь задач.Я слышал хорошие новости о Celery и RabbitMQ, если вы ищете сторонние варианты, и web2py включает свою собственную систему задач систему, которая может быть достаточной для ваших нужд.

Используя любой инструмент, вы определите функцию, которая инкапсулирует операцию, которую вы хотите выполнить в фоновом процессе.Затем выведите рабочих очереди в оперативный режим.Руководство web2py и форумы указывают, что это можно сделать с помощью оператора @reboot в системе cron web2py, который запускается при каждом запуске веб-сервера.Возможно, есть другие способы запуска рабочих, если это неудовлетворительно.

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

Теперь, чтобы получить выходные данныефоновая операция для пользователя.Когда вы вставляете задачу в очередь, вы должны получить уникальный идентификатор для задачи.Затем вы реализуете логику контроллера (то, что ожидает AJAX-вызов, или страницу, которая обновляется до завершения задачи), которая вызывает API очереди задач, чтобы проверить состояние указанной задачи.Если состояние задачи «выполнено», верните данные пользователю.Если нет, продолжайте ждать.

2 голосов
/ 29 декабря 2011

Возможно, просмотрите раздел книги о запущенных задачах в фоновом режиме . Вы можете использовать новый планировщик или создать домашнюю очередь ( пример электронной почты ). Есть также плагин web2py-celery , хотя я не уверен, в каком состоянии он находится.

1 голос
/ 29 декабря 2011

Это сложнее, чем можно было ожидать.Обратите внимание на предупреждения о взаимоблокировке в документации stdlib.subprocess .Это легко, если вы не возражаете против блокирования - используйте Popen.communicate.Чтобы обойти блокировку, вы можете управлять процессом, используя stdlib.subprocess из потока.

Мой любимый способ работы с подпроцессами - использовать spawnProcess Twisted .Но не так просто заставить Twisted хорошо играть с другими фреймворками.

...