Выполнение неблокирующих запросов? - Джанго - PullRequest
11 голосов
/ 30 апреля 2010

В последнее время я играл с другими фреймворками, такими как NodeJS.

Мне нравится возможность возвращать ответ, и я все еще могу выполнять дальнейшие операции.

, например

def view(request):
  do_something()
  return HttpResponse()

  do_more_stuff() #not possible!!!

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


Помощь будет очень цениться! = D

Ответы [ 4 ]

10 голосов
/ 30 апреля 2010

не из коробки, как вы уже вернулись из метода. Вы можете использовать что-то вроде Celery , которое будет передавать задачу do_more_stuff в очередь, а затем запускать do_more_stuff() вне потока запросов / ответов http.

7 голосов
/ 30 апреля 2010

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

Если вы хотите сделать многомногие асинхронные запросы и они должны быть неблокирующими, вы можете проверить Tornado .

2 голосов
/ 30 апреля 2010

Поскольку вы возвращаетесь из функции, do_more_stuff никогда не будет вызываться.

Если вы хотите сделать тяжелую работу, стоящую в очереди, прежде чем вы вернетесь, как предполагает Росс (+1 для Сельдерея).

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

Или, я полагаю, вы могли бы просто изменить дизайн своей страницы, чтобы использовать множество ajax для выполнения того, что вам нужно, включая запуск событий для представлений django, чтение данных из представлений и т. Д.

Все сводится к тому, где лежит асинхронное бремя: клиент, сервер или ответ.

Я еще не очень знаком с node.js, но было бы интересно увидеть тот сценарий использования, о котором вы говорите.

РЕДАКТИРОВАТЬ: Я немного больше изучил сигналы, и, хотя они действительно происходят в процессе, есть встроенный сигнал для request_finished после того, как запрос был обработан django, хотя это скорее поймать чем-то конкретным.

1 голос
/ 10 июня 2017

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

def foo(request):
    import threading
    from time import sleep
    def foo():
        sleep(5)
        # Do something
        print('hello, world')
    threading.Thread(target=foo).start()
    return JsonResponse(data={'detail': 'thread started'})
...