Внутренние элементы 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? Как это работает?
Ответы
Ответ 1
Node.js действительно не справляется ни с одним из этого, как вы предполагали. Вместо этого он использует ОС для выполнения большей части асинхронного ввода-вывода. Он использует select/epoll/kqueue в зависимости от операционной системы. "Они" просто вызывают вызов, и ОС обращается к потоку, кускам и т.д. Что касается выделенной части, это встроено в V8, он выполняет все связанные с обработкой вызовы для определенных событий, такие же, как это происходит в браузере. Наконец, вы можете посмотреть на libuv, который был написан вместе с node и теперь поддерживается Joyent. Это с открытым исходным кодом на Github, чтобы вы могли просматривать код, если хотите действительно детали = D
Ответ 2
Я очень подозреваю, что Node.JS идет тем же путем, что и Twisted, и использует только неблокирующие IO и greenlets. Потоки операционной системы кажутся довольно неэффективными для такого рода вещей.