Как лучше всего запустить асинхронный запрос задания в представлении Django?

Одна из моих функций просмотра - очень длительная работа по обработке, и ее необходимо обрабатывать по-разному. Вместо того, чтобы заставить пользователя ждать долгое время, было бы лучше, если бы я смог обедать обработкой, которая отправила бы по электронной почте результаты, и, не дожидаясь завершения, сообщит пользователю, что их запрос обрабатывается, и пусть они просматривают. Я знаю, что могу использовать os.fork, но мне было интересно, есть ли "правильный путь" в плане Django. Возможно, я смогу вернуть HTTP-ответ, и как-нибудь продолжить эту работу?

Ответ 1

Есть несколько решений этой проблемы, и лучший из них зависит от того, насколько тяжелой будет ваша рабочая нагрузка.

Если у вас есть легкая рабочая нагрузка, вы можете использовать подход, используемый django-mailer, который должен определить модель "jobs", сохранить новые рабочие места в базе данных, затем cron запускает автономный script каждый так часто, чтобы обрабатывать задания, хранящиеся в базе данных (удаляя их, когда это делается). Вы можете использовать что-то вроде django-chronograph для облегчения планирования задания

Если вам нужна помощь, чтобы понять, как написать script для обработки задания, см. статью Джеймса Беннетта Автономные скрипты Django для справки.

Если у вас очень высокая рабочая нагрузка, то есть вам потребуется больше одного сервера для обработки заданий, тогда вы хотите использовать реальную очередь распределенных задач. Здесь очень много соревнований, поэтому я не могу подробно описать все варианты, но хороший для использования с приложениями Django - celery.

Ответ 2

Почему бы просто не запустить thread, чтобы выполнить обработку, а затем продолжить отправку ответа?

Ответ 3

Прежде чем выбрать решение, вам нужно определить, как будет выполняться этот процесс. I. Это один и тот же процесс для каждого отдельного пользователя, данные одинаковы и могут регулярно планироваться? или каждый пользователь запрашивает что-то, а результаты немного отличаются?

В качестве примера, если данные будут одинаковыми для каждого отдельного пользователя и могут быть запущены по расписанию, вы можете использовать cron.

Смотрите: http://www.b-list.org/weblog/2007/sep/22/standalone-django-scripts/ или http://docs.djangoproject.com/en/dev/howto/custom-management-commands/

Однако, если запросы будут adhoc, и вам нужно что-то масштабируемое, которое может обрабатывать высокую нагрузку и является асинхронным: то, что вы действительно ищете, - это система опроса сообщений. Ваше представление добавит запрос в очередь, после чего будет действовать.

Есть несколько вариантов реализации этого в Django: Служба Django Queue является чисто django и python и проста, хотя последняя фиксация была в апреле, и, похоже, проект был оставлен. http://code.google.com/p/django-queue-service/

Второй вариант, если вам нужно что-то, что масштабируется, распространяется и использует серверы запросов с открытым исходным кодом: сельдерей - это то, что вам нужно

http://ask.github.com/celery/introduction.html http://github.com/ask/celery/tree