Что мешает Node.js быть асинхронным - PullRequest
0 голосов
/ 24 мая 2018

Когда вы работаете с Node.js, вы работаете с асинхронным программированием.

Для обработки иерархии вы, очевидно, используете обратные вызовы.Я также знаю, что некоторые функции блокируют основной цикл событий, например readFileSync () ..

Но я заметил, что нечто, даже такое простое, как цикл for, блокирует основной цикл событий какну.

Пример:

function func1() {
    for(var i = 0; i < 1000000000; i++) {
    }
    console.log("func1")
}
function func2() {
    console.log('func2')
}

func1()
func2()

В этом случае «func1» будет всегда печататься до «func2» и сначала после завершения цикла.Это не кажется мне асинхронным.Я имею в виду, почему мы ждем завершения func1 перед запуском func2?

Есть ли список действий, блокирующих основной цикл событий, или кто-нибудь может объяснить, почему это происходит?

1 Ответ

0 голосов
/ 24 мая 2018

Node.js имеет так называемый цикл обработки событий, и он выполняется только одним потоком.

Этот цикл просто выполняет задачу (в вашем случае выполняется ваш код .js), а затем этот один поток долженидти от начала до конца.За это время ничего больше не будет выполнено.(просто обратите внимание, что для опытных пользователей - если вы порождаете рабочих, вы можете, но это не то, как вы обычно используете Node.js)

У него много преимуществ - нет тупиков, детерминированное поведение и т. д.

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

Однако код, который вы пишете, всегда будет выглядеть так:

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