Торнадо обрабатывает данные в обработчике запросов после возврата - PullRequest
8 голосов
/ 11 марта 2011

В обработчике запросов торнадо, если мне нужно вызвать функцию foo (), которая не влияет на то, что возвращается пользователю, имеет смысл сначала вернуть результат пользователю, а затем вызвать foo ().Можно ли сделать это легко в торнадо (или с каким-нибудь сторонним пакетом)?

Ответы [ 4 ]

10 голосов
/ 08 сентября 2012

Это очень просто:

class Handler(tornado.web.RequestHandler):
    def get(self):
        self.write('response')
        self.finish() # Connection is now closed
        foo()
5 голосов
/ 11 марта 2011

ioloop.add_callback, Tornado выполнит обратный вызов в следующей итерации IOLoop.

0 голосов
/ 22 апреля 2011

предупреждение о плохом совете: вы можете использовать многопроцессорность.

http://docs.python.org/library/multiprocessing.html

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

0 голосов
/ 24 марта 2011

Нет, это не "просто" из коробки.То, что вы имеете в виду, это «огонь и забудь».Даже если вы используете пул потоков для обработки запроса, этот пул потоков будет принадлежать основному процессу python, который принадлежит Tornado.

Лучший подход - это очередь сообщений.Что-то вроде моркови.Таким образом, предположим, что у вас есть страница, на которой пользователи могут выполнить запуск для создания ОГРОМНОГО отчета, вы можете запустить ее в очереди сообщений, а затем завершить запрос Tornado, и с помощью некоторых магических и других приемов AJAX (выходящих за рамки Tornado) вы можетесидеть сложа руки и ждать, пока очередь сообщений не закончит свою работу (что технически может происходить на распределенном сервере в другом физическом месте).

...