2013-04-23 5 views
1

Есть ли у Django что-то похожее на ASP.NET MVC's Asynchronous Controller?Django асинхронные запросы

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

Разъяснение:

Вот поток, я могу сегодня

def my_view(request): 
    async = my_task.delay(params) 
    result = async.get() 
    return my_response(result) 

async.get() может занять несколько секунд - не слишком долго, так что клиент не может ждать ответа HTTP, чтобы получить обратно.

Этот код может привести к ненужной нагрузке на сервер. Что ASP.NET MVC-х AsynchronousController обеспечивает, является возможность разорвать эту функцию в два, что-то похожее на это:

def my_view(request): 
    async = my_task.delay(params) 
    return DelayedResponse(async, lambda result=>my_response(result)) 

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

ответ

1

Да, вы можете что-то сделать только тогда, когда задача завершена. Вы бы хотели посмотреть на что-то, что называется chain(). Вы можете связать задачи сельдерея в цепи:

chain = first_function.s(set) | second_Function.s(do) 

    chain() 

Эти две функции first_function and second_function оба являются функциями сельдерей. Вторая_функция выполняется только тогда, когда first_function завершает свое выполнение.

+0

Для получения дополнительной информации: http://docs.celeryproject.org/en/latest/reference/celery.html?highlight=chain#celery.chain – pynovice

+0

Я не хочу задачу цепи. Я уточню. – zmbq

2
  1. Вместо того, чтобы ждать завершения запроса, вы можете вернуть статус «Выполняется», а затем отправить еще один запрос, чтобы проверить, изменилось ли состояние. Поскольку вы делаете чистые запросы, ответ будет очень быстрым и не будет налагать много нагрузки на ваш веб-сервер.

  2. Вы можете передать этот конкретный вид/функцию на веб-сервер Tornado, предназначенный для асинхронного обратного вызова. Остальная часть сайта может продолжать работать на django.

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

+0

Что касается 1 и 3 - я не хочу, чтобы клиент отправил другой запрос. Это еще достаточно, чтобы быть приемлемым для конечных пользователей. – zmbq

+0

@zmbq У вас мало возможностей в Интернете. Либо вы делаете «опрос», «длительный опрос» или «веб-сайты». Если вы на 100% уверены, что это может быть сделано в один цикл запроса/ответа, вы не должны использовать сельдерей. Если вы его используете, выберите любой из трех методов, которые я упомянул. ASPIN Async Controller, я подозреваю, он просто скрывает вышеуказанные детали. – rantanplan

+0

Асинхронный контроллер ASP.NET - это бесплатный поток на веб-сервере, когда выполняется асинхронная операция. Поток веб-сервера может обрабатывать другой запрос. Как только асинхронная задача будет завершена, веб-сервер назначит ее одному из работающих потоков и продолжит свою обработку. Он не имеет ничего общего с опросом * client *, с использованием веб-узлов или чего-то еще. – zmbq

Смежные вопросы