Как метод server.listen поддерживает работу узла - PullRequest
0 голосов
/ 12 октября 2018

У меня вопрос о том, как метод server.listen поддерживает работу узла.Есть ли какой-нибудь метод setInterval внутри?

Я прочитал ответ в посте Как `server.listen ()` поддерживает выполнение программы узла .Но все еще не понял этого.

Кто-нибудь знает, пожалуйста, объясните мне.Спасибо.

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Node.js внутри libuv имеет своего рода счетчик количества открытых ресурсов, которые должны поддерживать процесс в рабочем состоянии.Здесь учитываются не только таймеры.Любой тип открытого TCP-сокета или прослушивающего сервера учитывается так же, как и другие асинхронные операции, такие как операции ввода-вывода файлов в процессе.Вы можете видеть вызовы в исходном файле node.js для uv_ref() и uv_unref().Вот как внутренний код для node.js помечает ресурсы, которые должны поддерживать выполнение процесса, или освобождает их по завершении.

Когда цикл событий пуст, то есть нет ожидающего события для запуска, node.js проверяет этот счетчик вlibuv и если он равен нулю, то он выходит из процесса.Если он не равен нулю, значит, что-то все еще открыто, что должно поддерживать процесс.

Итак, давайте предположим, что у вас есть незанятый сервер, работающий с сервером прослушивания, и пустой цикл обработки событий.Счетчик libuv будет отличен от нуля, поэтому node.js не завершает процесс.Теперь какой-то клиент пытается подключиться к вашему серверу.На самом низком уровне интерфейс TCP операционной системы уведомляет некоторый собственный код в файле node.js о том, что есть клиент, который только что подключился к вашему серверу.Затем этот собственный код упаковывает его в событие node.js и добавляет его в очередь событий node.js.Это заставляет libuv просыпаться и обрабатывать это событие.Он извлекает его из очереди событий и вызывает обратный вызов JS, связанный с этим событием, что приводит к запуску некоторого кода JS в файле node.js.Это приведет к тому, что на этом сервере будет генерироваться событие (типа eventEmitter), которое JS-код отслеживает на этом сервере, а затем JS-код может начать обработку этого входящего запроса.

Итак, на самом низком уровнеэто собственный код, встроенный в поддержку TCP в node.js, который использует интерфейс TCP на уровне ОС, чтобы операционная система сообщала, что входящее соединение с вашим сервером только что получено.Это преобразуется в событие в очереди событий node.js, в результате чего интерпретатор запускает обратный вызов Javascript, связанный с этим событием.

Когда этот обратный вызов будет выполнен, node.js снова проверит счетчик, чтобы увидеть,процесс должен выйти.Предполагая, что сервер все еще работает и ему не был вызван .unref(), который удаляет его из счетчика, то node.js увидит, что все еще работает, и процесс не должен завершиться.

0 голосов
/ 12 октября 2018

Он проходит через цикл событий.

Каждый раз, когда цикл обработки событий ожидает выполнения какой-либо ожидающей операции, выполняется операция server.listen ().

...