2014-02-12 2 views
1

Я запускаю набор экземпляров торнадо, который обрабатывает множество запросов из небольшого набора соединений keep-alive. Когда я сниму сервер для обслуживания, я хочу изящно закрыть запросы keep-alive, чтобы я мог снять сервер. Есть ли способ сказать клиентам «Эй, этот сокет закрывается» с помощью Tornado? Я огляделся, и self.finish() просто сбрасывает соединение.Закройте все (продолжите) гнездовые соединения в торнадо?

ответ

1

finish() здесь не применяется, потому что соединение в состоянии «keep-alive» не связано с RequestHandler. В общем, вы ничего не можете (или должны) делать с подключением keep-alive, за исключением закрытия, поскольку браузер не прослушивает ответ.

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

+0

я получаю, что около 'конца()', что мне нужно сделать на объект Application, чтобы закрыть соединение? Я понимаю, что это не огромная проблема, которая просто внезапно закрывается, но мне интересно, есть ли способ дать указание торнадо закрыть все открытые соединения. –

+0

В настоящее время не существует способа закрыть все открытые соединения, кроме как отключив процесс. –

+0

Хорошо, спасибо - вот ответ, который я искал :) –

2

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

  1. Я создал переменную на приложение, которое отмечает ли приложение завершает работу.
  2. В initialize() Я проверяю это, и если мы закрываем, я устанавливаю t его заголовок Connection: close, чтобы выполнить RFC, а затем установить self.request.connection.no_keep_alive = True, чтобы заставить соединение закрыться, прежде чем читать какие-либо данные, но после завершения запроса.

Относительно просто - выглядит примерно так:

class GracefulRequestHandler(tornado.web.RequestHandler): 
    def initialize(self): 
     if self.application.is_shutting_down: 
      self.set_header('Connection', 'close') 
      self.request.connection.no_keep_alive = True 
Смежные вопросы