Как лучше всего запустить асинхронный запрос на работу в представлении Django? - PullRequest
11 голосов
/ 13 сентября 2009

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

Ответы [ 3 ]

10 голосов
/ 14 сентября 2009

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

Если у вас небольшая рабочая нагрузка, вы можете использовать подход, использованный django-mailer , который заключается в определении модели «заданий», сохранении новых заданий в базе данных, а затем запуске cron в автономном режиме. Сценарий время от времени обрабатывает задания, хранящиеся в базе данных (удаляя их по завершении). Вы можете использовать что-то вроде django-хронограф , чтобы упростить планирование заданий

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

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

1 голос
/ 14 сентября 2009

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

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

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

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

Есть несколько вариантов реализации этого в 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

1 голос
/ 13 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...