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

Внутренние элементы node.js. Как это работает

Возможно, кто-то, кто реализовал модуль node.js, может объяснить протокол между очередью node.js, обработанной в одном потоке, и блокировкой операций ввода-вывода, которые будут выполняться модулем.

Я подозреваю, что он выглядит примерно так:

  • node.js thread регистрирует обратный вызов в форме замыкания и сохраняет его с некоторым идентификатором корреляции.
  • node.js вызывает метод (который должен выполнять блокировку IO) в модуле и передает ему параметры метода и идентификатор корреляции.
  • метод модуля отталкивает поток и блокирует операцию ввода-вывода.
  • Когда выполняется операция ввода-вывода, потоки модулей обращаются к потоку node.js и передают ему результаты и идентификатор корреляции.
  • node.js-поток находит сохраненное замыкание обратного вызова по идентификатору корреляции и вызывает его с результатом, возвращаемым из модуля.

Вопрос 1: Правильно ли указан порядок выше?

Вопрос 2: Что такое node.js queue? Это часть, в которой используется порт завершения epoll, kqueue или IO на окнах? Является ли механизмом обратного вызова для модуля уведомлять поток node.js, который закончил какой-то IO? Как это работает?

4b9b3361

Ответ 1

Node.js действительно не справляется ни с одним из этого, как вы предполагали. Вместо этого он использует ОС для выполнения большей части асинхронного ввода-вывода. Он использует select/epoll/kqueue в зависимости от операционной системы. "Они" просто вызывают вызов, и ОС обращается к потоку, кускам и т.д. Что касается выделенной части, это встроено в V8, он выполняет все связанные с обработкой вызовы для определенных событий, такие же, как это происходит в браузере. Наконец, вы можете посмотреть на libuv, который был написан вместе с node и теперь поддерживается Joyent. Это с открытым исходным кодом на Github, чтобы вы могли просматривать код, если хотите действительно детали = D

Ответ 2

Я очень подозреваю, что Node.JS идет тем же путем, что и Twisted, и использует только неблокирующие IO и greenlets. Потоки операционной системы кажутся довольно неэффективными для такого рода вещей.