Tornado Web & Постоянные Связи - PullRequest
4 голосов
/ 26 ноября 2009

Как я могу написать Http-сервер в TornadoWeb, который будет поддерживать постоянные соединения.

Я имею в виду, сможет получать много запросов и отвечать на них, не закрывая соединение. Как это на самом деле работает в асинхронном режиме?

Я просто хочу знать, как написать обработчик для обработки постоянного соединения. Как на самом деле это будет работать?

У меня есть такой обработчик:

class MainHandler(RequestHandler):

count = 0
@asynchronous
def post(self):

    #get header content type 
    content_type = self.request.headers.get('Content-Type')
    if not content_type in ACCEPTED_CONTENT:
        raise HTTPError(403, 'Incorrect content type')
    text = self.request.body
    self.count += 1     

    command = CommandObject(text, self.count, callback = self.async_callback(self.on_response))
    command.execute()

def on_response(self, response):
    if response.error: raise HTTPError(500)
    body = response.body   
    self.write(body)
    self.flush()

выполнить обратный вызов по окончании.

мое предположение правильно, что с такими вещами сообщение будет вызываться много раз а для одного соединения количество будет увеличиваться с каждым httprequest от клиента? но для каждого соединения у меня будет отдельное значение счетчика?

Ответы [ 3 ]

5 голосов
/ 11 ноября 2011

Я не думаю, что ваше предположение верно. Насколько я понимаю, как работает сервер Tornado, каждый запрос от клиента будет выдавать новый RequestHandler. Целью декоратора @tornado.web.asynchronous является предотвращение автоматического закрытия соединения сервером, когда возвращается функция вашего обработчика (post, get и т. Д.). Но в конце дня я думаю, что на каждый запрос есть только один ответ.

Я не верю, что дополнительные запросы от клиента будут направлены в тот же экземпляр класса RequestHandler. Вместо этого, я понимаю, что Торнадо настроен на то, чтобы учесть парадигму длительного опроса. Вот пример потока сообщений:

  1. Клиент делает POST запрос к серверу Tornado
  2. Сервер Tornado проверяет, готов ли ответ, если нет, вы можете добавить RequestHandler к какому-либо стеку или очереди (в зависимости от архитектуры вашего приложения)
  3. Сервер приходит с ответом (возможно, другой пользователь добавил сообщение в очередь, которое необходимо распределить для открытия соединений и т. Д.), И отправляет ответ обратно в RequestHandler, а затем вызывает функцию finish() для закрыть соединение
  4. Клиент делает еще один POST запрос на повторение процесса

Я думаю, что если вы хотите реализовать настоящие постоянные соединения, вы захотите изучить tornado.websocket (http://www.tornadoweb.org/documentation/websocket.html). Я еще не экспериментировал с этим модулем, поэтому боюсь, что не могу дать введите там.

Удачи!

0 голосов
/ 09 апреля 2010

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

0 голосов
/ 26 ноября 2009

Веб-фреймворк Tornado на самом деле поставляется с собственной серверной реализацией, которая поддерживает постоянные соединения, поэтому не нужно создавать собственный сервер. В документации есть раздел о том, как использовать его в производственной среде (за nginx).

...