В настоящее время у меня есть проект с аналогичными требованиями (только более сложный ^^).
Никогда не порождайте подпроцесс или поток из вашего представления Django.У вас нет контроля над процессами Django, и он может быть убит, приостановлен и т.д. до конца задачи.Он управляется веб-сервером (например, через Apache через WSGI).
Я бы сделал внешний сценарий, который будет выполняться в отдельном процессе.Я думаю, у вас есть два решения:
- Процесс, который всегда работает и сканирует каталог, в который вы помещаете свои файлы.Например, он будет проверять каталог каждые десять секунд и обрабатывать файлы
- То же, что и выше, но запускаться cron каждые x секунд.Это в основном имеет тот же эффект
- Используйте Celery для создания рабочих процессов и добавления заданий в очередь с вашим приложением Django.Затем вам нужно будет вернуть результаты одним из способов, доступных в Celery.
Теперь вам, вероятно, потребуется получить доступ к информации в моделях Django, чтобы в итоге отправить электронное письмо пользователю.Здесь у вас есть несколько решений:
- Импорт ваших модулей (моделей и т. Д.) Из внешнего скрипта
- Реализация внешнего скрипта как пользовательской команды (как предложил Кнутин)
- Сообщите результаты в приложение Django, например, через запрос POST.Затем вы выполняете отправку электронной почты, изменения статуса и т. Д. В обычном представлении Django.
Я бы пошел на внешний процесс и импортировал модули или запрос POST.Таким образом, это намного более гибко.Например, вы можете использовать многопроцессорный модуль для одновременной обработки нескольких файлов (таким образом, эффективно используя многоядерные машины).
Базовый рабочий процесс будет:
- Проверкакаталог для новых файлов
- Для каждого файла (может быть распараллелен):
- Процесс
- Отправка электронной почты или уведомление о вашем приложении Django
- Спи на время
Мой проект содержит действительно процессорозатратную обработку.В настоящее время я использую внешний процесс, который дает задания обработки пулу рабочих процессов (это в основном то, что Celery может сделать для вас) и сообщает о ходе выполнения и результатах обратно в приложение Django через запросы POST.Он работает очень хорошо и является относительно масштабируемым, но я скоро заменю его на использование Celery в кластере.