Как вы вызываете функцию после завершения загрузки клиента с веб-сервера торнадо? - PullRequest
1 голос
/ 24 мая 2010

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

Я установил инструмент газа Firefox, и он замедлил соединение до скорости коммутируемого соединения, и установил этот обработчик, чтобы генерировать кучу случайного текста мусора:

class CrapHandler(BaseHandler):
    def get(self, token):
        crap = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(100000))
        self.write(crap)
        print "done"

Я получаю следующий вывод из торнадо сразу после выполнения запроса:

done
I 100524 19:45:45 web:772] 200 GET /123 (192.168.45.108) 195.10ms

Затем клиент загружает около 20 секунд. Я ожидал, что он напечатает «выполнено» после того, как клиент будет готов.

Кроме того, если я сделаю следующее, я получу почти такой же результат:

class CrapHandler(BaseHandler):
    @tornado.web.asynchronous
    def get(self, token):
        crap = ''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(100000))
        self.write(crap)
        self.finish()
        print "done"

Я что-то упустил здесь? Может ли торнадо даже поддержать то, что я пытаюсь сделать? Если нет, то есть ли альтернатива?

1 Ответ

1 голос
/ 28 мая 2010

Полагаю, вы ищете что-то, что работает в методе обработки запросов on_connection_close, который вы можете переопределить.

Имейте в виду, что если вы работаете за nginx, то tornadoнемедленно ответьте на nginx, и nginx будет медленно отвечать клиенту.

Также имейте в виду, что добавление @tornado.web.asynchronous фактически не делает запрос асинхронным.Он только настраивает запрос на использование tornado.http.AsyncHTTPClient.

...