Подтвердить что ты не робот

Что такое торнадо-илооп и рабочий процесс торнадо?

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

внутри 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 или он просто запускается один раз, когда init?

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

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

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

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

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

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

4b9b3361

Ответ 1

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

  • Здесь _impl доступен любой механизм опроса сокета, epoll в Linux, select в Windows. Таким образом, self._impl.register(fd, events | self.ERROR) передает запрос "wait for some event" в базовую операционную систему, в том числе, в частности, события ошибок.

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

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

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

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

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

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

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