что такое торнадо ioloop и как работает торнадо? - PullRequest
27 голосов
/ 16 августа 2011

Я хочу знать внутренний рабочий процесс Торнадо, и видел эту статью , это здорово, но кое-что, что я просто не могу понять

в ioloop.py есть такая функция

def add_handler(self, fd, handler, events):
    """Registers the given handler to receive the given events for fd."""
    self._handlers[fd] = handler
    self._impl.register(fd, events | self.ERROR)

так что это значит? каждый запрос будет вызывать add_handler или он запускается один раз при инициализации?

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

Какая связь между ioloop и iostream?

как httpserver работает с ioloop и iostream?

есть ли диаграмма рабочего процесса, чтобы я мог ее ясно увидеть?

извините за эти вопросы, я просто запутался

любая ссылка, предложение, подсказка помогает. большое спасибо:)

1 Ответ

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

Я посмотрю, смогу ли я ответить на ваши вопросы по порядку:

  • Здесь _impl - это любой из доступных механизмов опроса сокетов, epoll в Linux, select вОкна.Таким образом, self._impl.register(fd, events | self.ERROR) передает запрос «Ожидание некоторого события» в базовую операционную систему, в частности, включая события ошибок.

    При запуске HTTPServer регистрирует сокеты для приема соединений, используя IOLoop.add_handler(),Когда соединения принимаются, они генерируют больше коммуникационных сокетов, которые, вероятно, также добавят обработчики событий через IOStream, который также может вызвать add_handler().Поэтому новые обработчики будут добавляться как в начале, так и по мере получения соединений.

  • Да, каждое новое соединение с сокетом будет иметь уникальный файловый дескриптор.Исходный сокет, который прослушивает HTTPServer, должен сохранять свой дескриптор файла.Файловые дескрипторы предоставляются операционной системой.

  • IOLoop обрабатывает события, связанные с сокетами, например, есть ли у них данные, доступные для чтения, могут ли они быть записаны ви произошла ли ошибка.Используя службы операционной системы, такие как epoll или select, он может сделать это очень эффективно.

    IOStream обрабатывает потоковые данные по одному соединению и использует IOLoop для асинхронного выполнения,Например, IOStream может считывать столько данных, сколько доступно, а затем использовать IOLoop.add_handler(), чтобы дождаться получения дополнительных данных.

  • При listen() создается HTTPServerсокет, который он использует для прослушивания соединений, использующих IOLoop.Когда соединение установлено, оно использует socket.accept() для создания нового сокета, который затем используется для связи с клиентом с использованием нового HTTPConnection.

    . HTTPConnection использует IOStream для передачи данных.или от клиента.Этот IOStream использует IOLoop, чтобы сделать это асинхронным и неблокирующим способом.Многие объекты IOStream и HTTPConnection могут быть активными одновременно, и все они используют один и тот же IOLoop.

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

...