Вы можете разбить вашу проблему на следующие шаги:
- Пользователь указывает параметры задачи
- Система выполняет задачу
- Система отображает результат для пользователя
Вы можете сделать все это:
- Последовательно и синхронно одним махом; или
- Шаг за шагом, асинхронно.
Синхронно
Вы можете запустить скрипт при генерации ответа, но он будет иметь следующие недостатки:
- Процесс на сервере, обрабатывающий ваш запрос, будет заблокирован до завершения сценария. Это может повлиять или не повлиять на обработку других запросов тем же сервером (это будет зависеть от количества одновременных запросов, обрабатываемых скриптом и т. Д. c.)
- Клиент (например, ваш браузер) и даже сервер может отключиться, если выполнение сценария занимает слишком много времени. Вы можете исправить это до некоторой степени, настроив свой сервер соответствующим образом.
Однако прелесть этого подхода заключается в его простоте. Для этого вы можете просто передать параметры через запрос, сервер анализирует и выполняет сценарий, а затем возвращает вам результат.
Нет настройки очереди сообщений, планировщика задач или чего-либо еще необходимого.
Асинхронно
В идеале, хотя для долгосрочных задач, лучше, чтобы это выполнялось вне обычного запроса-ответа l oop для следующих преимуществ:
- Сервер, отвечающий на запросы, может фактически обслуживать другие запросы.
- Некоторые сценарии могут занять некоторое время, некоторые вы даже не знаете, будет ли он завершен sh
- Сценарий больше не зависит от надежности сети (представьте, что запуск дорогое задание, тогда ваше inte rnet соединение пропускается или просто прерывисто; вы ничего не сможете сделать)
Недостатком этого является то, что вы должны настроить больше вещей, что увеличивает сложность проекта и точки отказа.
Производитель-потребитель
Что бы вы ни выбрали, обычно лучше следовать шаблону производитель-потребитель:
- Производитель создает задачи и помещает их в очередь
- Потребитель берет задачу из очереди и выполняет ее
Производитель в основном вы, пользователь. Вы указываете задачу и параметры этой задачи.
В этой очереди может быть любое хранилище данных: хранилище данных в памяти, например, Redis; очередь сообщений, такая как RabbitMQ; или система управления реляционной базой данных, такая как PostgreSQL.
Потребителем является ваш скрипт, выполняющий эти задачи. Существует несколько способов запуска потребителя / скрипта: через Celery, как вы упомянули, который запускает несколько рабочих для выполнения задач, проходящих через очередь; через простой, основанный на времени планировщик заданий, такой как crontab; или даже вы вручную запускаете скрипт
Вопрос на самом деле не тривиален, так как решение зависит от того, какую задачу вы на самом деле пытаетесь выполнить. Лучше всего оценить ограничения, параметры и фактические задачи, чтобы решить, какой подход вы выберете.
Но просто для того, чтобы дать вам более актуальное руководство:
Просто Сохраняйте это простым, если у вас нет веских причин для этого (например, отключение сервера или соединение inte rnet на практике ненадежно), на самом деле нет причин для фантазии.
Чем больше блокируется задача, или чем дольше она выполняется или чем больше она зависит от сторонних API через сеть, тем больше смысла использовать sh в фоновом процессе для повышения надежности и отказоустойчивость.
В вашем сценарии импорта электронной почты я, скорее всего, добавлю sh в фоновый режим:
- У вас будет страница, где вы можете добавить задачу в базу данных.
- На странице сведений о задаче отобразите сведения о задаче и приведенный ниже результат, если он существует, или «Обработка ...», в противном случае
- Иметь скрипт, который выполняет задачи (импортировать электронную почту из gmail с учетом параметров задачи) и сохранять результаты в базе данных
- Запланировать запуск этого скрипта каждые несколько минут через crontab
Да, у вышеизложенного есть побочные эффекты, такие как crontab, запускающий скрипт несколько раз в одно и то же время, и тому подобное, но я не буду go вдаваться в подробности, не зная больше о специфике задачи.