Метод связывания http-сервера Tornado - PullRequest
1 голос
/ 16 августа 2011

В httpserver.py есть метод bind, в конце этого метода есть код, подобный следующему:

sock.bind(sockaddr) 
sock.listen(128) 
self._sockets[sock.fileno()] = sock 
if self._started: 
self.io_loop.add_handler(sock.fileno(), self._handle_events, 
                         ioloop.IOLoop.READ) 

Это означает, что когда сокет подключен и инициирует событие ioloop.IOLoop.READ, вызовите self._handle_events, верно?

Но каждый клиент будет генерировать новый дескриптор файла, верно?

Так как же подключить сокет клиента ioloop через sock.fileno()? (метод связывания httpserver вызывается только один раз)

1 Ответ

0 голосов
/ 16 августа 2011

Я только что быстро взглянул на источник, и, похоже, он работает так:

Tornado не контролирует сами сокеты, он передает это задание в операционную систему, используя epoll (Linux) или select. Вызов self.io_loop.add_handler просто добавляет обратный вызов, когда новое соединение доступно.

Клиентские подключения устанавливаются self._handle_events, что создает новый HTTPConnection для каждого нового подключения, полученного сокетом. Коммуникационный сокет, используемый каждым HTTPConnection, является новым сокетом, созданным путем вызова sock.accept(). Сервер продолжает принимать соединения в том же сокете, что и раньше.

итого в итоге:

  • Да, io_loop вызывает self._handle_events при обнаружении нового соединения в сокете.
  • Нет, сокет повторно используется для новых подключений. Вместо этого для каждого клиента создается новый объект HTTPConnection с отдельным сокетом для связи.
  • io_loop не нужно активно контролировать сокет. Он передает обязанности операционной системе, используя epoll или select. Фактическое общение с клиентами осуществляется объектами HTTPConnection.

Я думаю, что ключевым моментом для понимания является то, что сокет здесь используется только для приема новых соединений. Когда соединение принято с использованием sock.accept(), возвращается новый сокет для связи, который затем присоединяется к объекту HTTPConnection.

...