Как цикл обработки событий и механизм v8 взаимодействуют друг с другом в NodeJS? - PullRequest
2 голосов
/ 10 марта 2019

Я не понимаю, что на самом деле делает NodeJS однопоточным?Является ли цикл обработки событий однопоточным или фактический код JavaScript выполняется в одном потоке с использованием механизма v8?Как эти два (v8 и цикл обработки событий) взаимодействуют друг с другом?И где я могу увидеть место, в коде реализации, эти два встречаются?

Ответы [ 3 ]

1 голос
/ 10 марта 2019

Node.js против V8 против цикла обработки событий

  • NodeJS - это среда выполнения JavaScript, построенная на движке Chrome V8 JavaScript.
  • Javascript является однопоточным, как и любая реализация Javascriptкак NodeJS.
  • Цикл событий - это, прежде всего, программная конструкция (циклически проходящая через очередь сообщений / событий) и основа модели параллелизма JavaScript.
  • V8 обеспечивает реализацию события по умолчаниюLoop.NodeJS использует цикл обработки событий, предоставляемый libuv

Как они «взаимодействуют»?

Я думаю, что ваше недоразумение в том, что оно действительно однопоточное, но оно 'кажется многопоточным ».Как?- из-за цикла событий.

Поскольку JavaScript является однопоточным, цикл событий - это то, что позволяет NodeJS выполнять неблокирующие операции ввода-вывода в фоновом режиме «параллельно».NodeJS по возможности выгружает эти операции в системное ядро ​​(которое в настоящее время является многопоточным)

Всякий раз, когда одна из этих операций завершается - ядро ​​сигнализирует NodeJS о выполнении этой функции обратного вызова операций - добавляет функцию обратного вызова этой операции вочередь poll , которая должна быть выполнена в фазе poll цикла обработки событий (объяснено ниже).

При запуске NodeJS инициализирует цикл обработки событий и начинает обработку.Цикл событий состоит из последовательности этапов обработки, фазы опроса и очереди для обработки ввода-вывода.

Каждая фаза имеет очередь обратных вызовов FIFO для выполнения.Хотя каждая фаза является особенной по-своему, обычно, когда цикл событий входит в данную фазу, он выполняет любые операции, специфичные для этой фазы, затем выполняет обратные вызовы в очереди этой фазы до тех пор, пока очередь не будет исчерпана или максимальное количество обратных вызововвыполнил.Когда очередь исчерпана или достигнут предел обратного вызова, цикл обработки событий переходит к следующему этапу и т. Д. src

Подробнее о фазах обработки и цикле обработки событий можно узнать здесь: Цикл событий Node.js, таймеры и process.nextTick () |Node.js

0 голосов
/ 10 марта 2019

Упрощенное объяснение того, почему JavaScript является однопоточным:

Event Loop постоянно проверяет очередь, чтобы увидеть, есть ли какой-либо код, который должен быть запущен.

while (queue.waitForMessage()) {
  queue.processNextMessage();
}

queue.waitForMessage() является синхронным, поэтому ожидает поступления нового сообщения, если очередь в данный момент пуста. В среде JavaScript ни одна функция не может быть прервана. - как только функция начинает выполняться, она запускается до завершения, прежде чем будет выполнен любой другой код.

Node.js и V8

Такое же поведение встречается в любой среде JavaScript, а Node.js - это просто среда выполнения JavaScript, построенная на движке Chrome V8 JavaScript

Цикл событий Node.js

Конструкция Node.js Event Loop более сложна, чем я описал выше. Он состоит из нескольких этапов обработки FIFO очередей для таймеров и обратных вызовов, и именно эти элементы придают среде Node.js асинхронное поведение. Все операции ввода-вывода выгружаются в ОС, и поскольку базовая система является многопоточной, операции выполняются в фоновом режиме. Когда операция завершена, система уведомляет процесс Node.js, и в соответствующую очередь добавляется обратный вызов для ожидания выполнения. Более полное описание цикла событий Node.js доступно в разделе руководств официального веб-сайта Node.js и в документации библиотеки libuv , которая реализует асинхронный ввод-вывод. .

0 голосов
/ 10 марта 2019

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

Но в javascript также есть обещания и асинхронный код.Как это возможно, если в любой момент может выполняться только одна вещь?

Ответ - цикл обработки событий, который отслеживает выполнение и выполняет асинхронную работу после основной работы, которая имитирует асинхронную работу.

Я не могу понять, как выглядит цикл событий, так как мои собственные знания там не очень хороши.

...