Рубрики
Без рубрики

Прогулка внутри петли событий Node.js

Oluwaseun Omoyajowo Прогулка внутри Node.js Event Loopnodejs Loopnodejs Loop, возможно, одна из самых неправильно понятых концепций в узле. К сожалению, большинство статей онлайн не помогают. До нескольких дней назад у меня также не было неправильное представление о том, как работает сервис, спасибо, благодаря Даниэлю Хан

Oluwaseun Omoyajowo

Контур событий Nodejs, пожалуй, один из самых неправильно понятых концепций в узле. К сожалению, большинство статей онлайн не помогают. До нескольких дней назад у меня также не было неправильное представление о том, как цикл событий работает благодаря Дэниэлу Хан Статья Отказ Даниэль подчеркнул некоторые из этих заблуждений, а также объяснил реалии. Я просто укажу самый популярный ниже, и вы можете пойти через Даниэль Статья После и прочитайте все в полном объеме.

« Контур событий работает в отдельном потоке в пользовательском коде. Существует главная тема, где код JavaScript пользователя (Code yelland Code) работает, а другой, который запускает петлю события. Каждый раз, когда происходит асинхронная операция, основной нить будет передавать работу до потока петли события, и после того, как это будет сделано, нить петли события будет пинговать основной поток для выполнения обратного вызова. ” – Это не правильно

Это в основном было моим собственным представлением петлей событий, поэтому я решил провести исследование и глубже. В этой статье я буду объяснять, как все происходит с общим примером.

Чтобы начать, создайте файл JavaScript, сохраните его с любым именем, который вам нравится, мой – «index.js». Введите или скопируйте и вставьте следующие коды в файл.

const fs = require('fs');
const setTimeOutlogger = ()=>{    console.log('setTimeout logger');}const setImmediateLogger = ()=>{    console.log('setImmediate logger');}
//For timeout setTimeout(setTimeOutlogger, 1000);
//File I/O operationfs.readFile('test.txt', 'utf-8',(data)=>{    console.log('Reading data 1');});fs.readFile('test.txt', 'utf-8',(data)=>{    console.log('Reading data 2');});fs.readFile('test.txt', 'utf-8',(data)=>{    console.log('Reading data 3');});fs.readFile('test.txt', 'utf-8',(data)=>{    console.log('Reading data 4');});fs.readFile('test.txt', 'utf-8',(data)=>{    console.log('Reading data 5');});
//For setImmediatesetImmediate(setImmediateLogger);setImmediate(setImmediateLogger);setImmediate(setImmediateLogger);

Создайте текстовый файл, «.txt» в том же каталоге и сохраните его любым именем. Мой – «test.txt». Внутри этого файла типа что-нибудь понравилось.

Перед запуском файла JavaScript, если вы сможете угадать порядок вывода консоли, затем * Thumbs up для вас *. Мой собственный выход:

setImmediate loggersetImmediate loggersetImmediate loggerReading data 1Reading data 2Reading data 3Reading data 4Reading data 5setTimeout logger

Ваш может быть разным, в зависимости от размера файла, который вы читаете, и содержание в созданном вами файле «.txt».

Так Что произошло в контуре события, когда вы провели код?

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

В контуре события есть шесть фаз, но один работает внутри. Ниже приведен обзор каждого фазы из Node.js Док Отказ

  • Таймеры: Эта фаза выполняет обратные вызовы, запланированные Setimeate () и SetInterval () Отказ
  • Обратные вызовы ввода/вывода: выполняет практически все обратные вызовы за исключением закрытых обратных вызовов, которые запланированы таймерами, а setimmediate () Отказ
  • праздный Подготовьте: используется только внутренне.
  • Опрос: Получить новые события ввода/вывода; Узел будет блокировать здесь, когда это необходимо.
  • Проверить: setimmediate () Обратные вызовы вызываются здесь. Взгляды обратных вызовов: например Socket.on («Закрыть») Отказ

Таймеры

Из нашего примера мы Setimeate до 1, прежде чем вызовать TimeOutLogger функция. Это первая фаза (не совсем первая, но из нашего примера это) контура событий. Таймер устанавливает порог, на котором будет выполняться обратный вызов.

Важно отметить, что каждая фаза имеет первый в первом, во-первых (FIFO) очереди обратных вызовов для выполнения.

Обратные вызовы ввода/вывода

Эта фаза выполняет системные обратные вызовы ошибок, такие как протокол соединения протокола управления передачей (TCP) Connection Connection EConnrefused. Хотя эта фаза называется обратным вызовом ввода/вывода, понять, что в этапе опроса выполняется обычные обратные вызовы операций ввода/вывода. Я буду погружаться в это дальше. В нашем примере здесь не было очередно обратный вызов.

Опрос

Эта фаза, где большая часть работы сделана. От Node.js doc фаза Опрос в основном делает две вещи:

  • Выполнение скриптов для таймеров Чей порог истек
  • Обработка событий в очереди опроса

После нашего примера на этом этапе есть пустая очередь с Fs.readfile не завершен. В ожидании, таймер 1s Пороговое набор ранее не истек. Контур событий проверяет обратные вызовы, поставленные в очереди setimmediate () на этапе проверки. Есть три обратных вызова от нашего примера в очереди setimmediate () Отказ Контур событий входит в фазу проверки.

Проверять

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

После выполнения всех обратных вызовов в проверке очереди и порог таймера не достигнут. Но на этапе опроса есть очередные обратные вызовы, уже от Fs.readfile Отказ Структура событий выполняет все обратные вызовы (блоки петлей событий) до максимума или очереди снова пустые. Вот вещь, выполняя обратные вызовы, возможно, порог таймера для прохождения. А с новым обратным вызовом таймера, готов к выполнению, таймер должен будет дождаться обратных вызовов опроса для выполнения, вызывая дополнительные задержки. Это одна из причин, по которым рекомендуется не делать так много вещей внутри ваших обратных вызовов. После выполнения обратных вызовов очереди опросов, цикл события немедленно обернутся к таймеру, чтобы выполнить обратный вызов.

Примечание: Чтобы не допустить фазы опроса от голодающей петли события, Libuv Также имеет жесткую максимум (зависит от системы), прежде чем он останавливает опрос для большего количества событий.

Заключение

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

Спасибо за прочтение. Я Олувасеун Омояйово, внештатный полный стек веб-разработчика. Связаться! Twitter LinkedIn Github Facebook

Оригинал: “https://www.freecodecamp.org/news/walking-inside-nodejs-event-loop-85caeca391a9/”