Как работают циклы событий в node.js?

Как работают циклы событий в node.js?

6 декабря 2022 г.

Когда мы запускаем приложение node.js, оно загружает цикл событий и добавляет необходимые обратные вызовы в стек вызовов. В этой статье вы подробно узнаете, как работает цикл обработки событий в node.js.

Зачем вам изучать цикл обработки событий в node.js

Вот несколько причин, по которым важно изучать цикл обработки событий:

* Понимание того, как работают циклы событий node.js, поможет вам писать более производительный код. * Это упрощает отладку кода, когда в вашем приложении что-то неожиданно выходит из строя

Что такое цикл событий?

Согласно __официальному __сайту node.js, цикл обработки событий позволяет node.js выполнять неблокирующие операции ввода-вывода, несмотря на то, что JavaScript является однопоточным, по возможности перекладывая операции на ядро ​​системы.

Давайте разделим это определение на три ключевых слова:

  • Неблокирующие операции ввода-вывода
  • Однопоточный
  • Ядро

Неблокирующие операции ввода-вывода

Программа называется неблокирующей, если выполнение операции не затруднено. Поскольку мы упомянули здесь о неблокировке, важно также упомянуть, что такое блокировка. Это просто означает, что вы должны завершить операцию после завершения другой. См. __официальный __сайт, чтобы узнать об этом подробнее.

Однопоточный

Программа называется однопоточной, если она имеет только один стек вызовов и способна выполнять одну задачу за раз, если использует концепцию FIFO. Это означает, что первая программа всегда будет запускаться перед следующей в стеке. Хотя JavaScript может показаться однопоточным языком, он зависит исключительно от среды, в которой он выполняется.

Ядро

Ядро в данном контексте просто означает операционную систему, в которой работает программа. Javascript является однопоточным, но node.js имеет возможность не блокировать поток при выполнении нескольких операций ввода-вывода (I/O). Он делает это, перенося эту операцию на другую операционную систему (например, Linux, Windows, Mac OS X и т. д.), когда это возможно. Операции в основном выгружаются в ОС; именно это отличает Javascript от node.js.


Как работает цикл обработки событий в node.js

Когда мы запускаем приложение узла, сразу же запускается цикл обработки событий. Цикл событий состоит из нескольких фаз, и каждая фаза имеет очереди обратного вызова для выполнения. Когда цикл событий добавляется к определенной фазе, он будет выполнять некоторые операции на этой конкретной фазе, а затем выполнять некоторые обратные вызовы в этой очереди фазы.

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

Четыре наиболее важных этапа:

  • Обратный вызов с истекающим временем
  • Опрос ввода-вывода и обратные вызовы
  • установить немедленные обратные вызовы
  • закрыть обратные вызовы

Обратный звонок с истекающим временем

На этом этапе обрабатываются обратные вызовы от таймеров с истекшим сроком действия;

Например,

setTimeout (()=> console.log('истекшие таймеры'), 1000)

это функция, которая устанавливает таймер на истечение определенного количества секунд.

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

Если время таймера истекает позже, в то время, когда одна из других фаз была обработана, то обратный вызов этого таймера будет вызван только тогда, когда цикл обработки событий вернется к первой фазе. Это работает так во всех четырех фазах.

Опрос ввода-вывода и обратные вызовы

Опрос в основном означает поиск новых событий ввода-вывода, готовых к обработке, и размещение их в очередях обратного вызова. Очень важно понимать, что в контексте приложения узла ввод-вывод просто относится к таким вещам, как сеть и доступ к файлам.

Например,

fs.readFile('file.txt', (e, d)) =>

console.log('Файл прочитан')

})

Именно на этом этапе выполняется 99 % нашего кода, потому что в типичном приложении Node большая часть того, что нам нужно сделать, связана с подключением к сети и чтением файлов.

установить немедленные обратные вызовы

Мы используем этот специальный таймер, если хотим обрабатывать обратные вызовы сразу после ввода-вывода фаз опроса и выполнения. что может быть важно в некоторых более сложных случаях.

setImmediate(() => setImmediate(() =>

console.log('немедленно');

});

закрыть обратные вызовы

На этом этапе обрабатываются все события закрытия, например, когда веб-сервер отключается. На этом завершается четвертая фаза цикла обработки событий.

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

С вышесказанным мы закончили тик, который составляет всего один такт в цикле событий. После этого цикла node.js решает, продолжать цикл или выйти из цикла.

Node делает это, просто проверяя, есть ли какие-либо задачи (например, таймеры или задачи ввода-вывода), которые все еще выполняются в фоновом режиме. А если таковых нет, то просто выйдет из приложения. Если есть ожидающие задачи, они перейдут к следующей, например, при работе с HTTP-запросами или чтении файлов.

Это в основном то, о чем цикл событий узла.

Избегайте блокировки цикла событий

Поскольку все в node.js в конечном итоге выполняется в одном потоке, миллионы пользователей могут одновременно обращаться к одному и тому же пулу, что делает node.js очень легким и масштабируемым. Но в то же время это сопряжено с опасностью блокировки одного потока, что замедлит работу всего приложения и даже остановит его.

Рекомендации по предотвращению блокировки цикла событий

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

  1. Не используйте синхронизированную версию функций в модулях fs, crypto и Zlib в своих функциях обратного вызова.
  2. При работе с большими объектами соблюдайте осторожность при использовании JSON.
  3. Не используйте слишком сложные регулярные выражения (например, вложенные квантификаторы).
  4. Не выполняйте сложные вычисления, например, над вложенными объектами.

Заключительные мысли о циклах событий в node.js

Цикл событий — это то, что делает возможным асинхронное программирование в node.js. что делает его самой важной функцией в дизайне Node. Это отличает node.js от других платформ.

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


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE