Я играл с другими платформами, такими как NodeJS, в последнее время.
Я люблю возможность возвратить ответ и все еще способность сделать дальнейшие операции.
например.
def view(request):
do_something()
return HttpResponse()
do_more_stuff() #not possible!!!
Возможно, Django уже предлагает способ выполнить операции после возврата запроса, если это так, который был бы большим.
Справка очень ценилась бы!=D
Поскольку вы возвращаетесь из функции, do_more_stuff никогда не будет вызван.
Если вы собираетесь заниматься тяжелой работой, выстраивайте что-то в очередь перед возвращением, как предлагает Росс (+1 за Сельдерей).
, однако, если вы хотите вернуть какой-то контент ... тогда, вероятно, вы ищете что-то и возвращать больше контента пользователю потоковой передачи. Вы можете передать HttpResponse итератор или генератор, и он будет выполнять итерацию и выталкивать контент тонким потоком. Это немного мерзко, но если вы рок-звезда-генератор, вы, возможно, сможете сделать достаточно в различных состояниях, чтобы выполнить то, что вы хотите.
Или, я полагаю, вы могли бы просто переделать свою страницу, чтобы использовать много ajax, чтобы делать то, что вам нужно, включая запуск событий в представлениях django, чтение данных из представлений и т. Д.
Это как бы сводится к тому, где бремя async будет сидеть: клиент, сервер или ответ.
Я еще не так хорошо знаком с node.js, но было бы интересно увидеть случай использования, о котором вы говорите.
РЕДАКТИРОВАТЬ: Я немного больше изучил сигналы, и хотя они действительно возникают в процессе, есть встроенный сигнал для request_finished после того, как запрос был обработан django, хотя это скорее уловка, чем что-то специфический.
не из коробки, поскольку вы уже вернулись из метода. Вы можете использовать что-то вроде Celery, который передаст задачу do_more_stuff
в очередь и затем заставит ее выполнять do_more_stuff()
вне потока http-запросов/ответов.
Django позволяет вам сделать это с помощью сигналов, более подробную информацию можно найти здесь . (Обратите внимание, как я уже говорил в комментариях ниже, сигналы не являются неблокирующими, но они позволяют выполнять код после возврата ответа в представлении.)
Если вы хотите выполнить много, много асинхронных запросов и хотите, чтобы они не блокировались, вы можете проверить Tornado.