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