Внутренние узлы node.js. Как это на самом деле работает - PullRequest
18 голосов
/ 20 декабря 2011

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

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

  1. Поток node.js регистрирует обратный вызов в форме замыкания и сохраняет его с некоторым идентификатором корреляции.
  2. node.js вызывает метод (который должен выполнять блокировку ввода-вывода) для модуля и передает ему параметры метода и идентификатор корреляции.
  3. метод модуля раскручивает поток и блокирует операцию ввода-вывода.
  4. когда операция ввода-вывода завершается, поток модулей перезванивает потоку node.js и передает ему результаты и идентификатор корреляции.
  5. Поток node.js находит сохраненное закрытие обратного вызова по идентификатору корреляции и вызывает его с результатом, возвращаемым из модуля.

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

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

Ответы [ 2 ]

9 голосов
/ 01 августа 2012

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

0 голосов
/ 27 декабря 2011

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

...