Асинхронные фоновые процессы с web2py

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

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

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

3 Solutions collect form web for “Асинхронные фоновые процессы с web2py”

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

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

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

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

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

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

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

  • Сохранение деталей конфигурации
  • Получать данные из POST ajax-вызова с помощью web2py
  • составной ключ в web2py
  • web2py - Функция контроллера не вызывается при использовании обратного вызова метки привязки
  • Функция mail.send () в web2py для возвращенного адреса электронной почты или адреса электронной почты, который не существует
  • Django vs web2py для начинающего разработчика
  • Различные вызовы ajax с циклом опроса
  • web2py Ajax search
  • Контроллеры Web2py с параметрами?
  • Пользовательские классы CSS для ввода виджета SQLFORM в web2py
  • Является ли Google App Engine правильным для меня?
  • Python - лучший язык программирования в мире.