2009-11-26 3 views
4

Как написать Http-сервер в TornadoWeb, который будет поддерживать постоянные подключения.Tornado Web & Persistent Connections

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

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

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

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 от клиента? , но для каждого соединения у меня будет отдельное значение счета?

ответ

0

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

+0

Да, я знаю, но нет объяснений, как реально обрабатывать постоянные соединения. – Engrost

0

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

5

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

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

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

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

Удачи!

Смежные вопросы