Введение

Всем привет, я Мухаммад Талха, старший инженер Flutter, вернулся с новой статьей. В прошлой статье мы оставили разговор о цикле событий.

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

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

Цикл событий

Цикл событий — это цикл, запускаемый или запускаемый NodeJS, который поддерживает процесс NodeJS в рабочем состоянии и, как я только что упоминал в предыдущей статье (здесь), который обрабатывает все обратные вызовы и имеет определенный порядок, в котором они выполняются. обратные вызовы.

Так что в основном это петля, которая просто продолжает зацикливаться.

Таймеры

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

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

Выполняет вызовы setTimeout() и setInterval()

Ожидающие обратные вызовы

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

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

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

Он выполняет отложенные обратные вызовы, связанные с вводом-выводом.

Голосование

После работы над этими открытыми обратными вызовами и, надеюсь, завершения их всех, он войдет в фазу опроса. Фаза опроса — это в основном фаза, на которой NodeJS будет искать новые события ввода-вывода и в основном делает все возможное, чтобы немедленно выполнить свои обратные вызовы, если это возможно. Теперь, если это невозможно, он отложит выполнение и фактически зарегистрирует это как отложенный обратный вызов.

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

Получить новые события ввода-вывода, выполнить их обратные вызовы

Проверять

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

Выполнение обратных вызовов setImmediate()

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

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

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

Выполняет все обратные вызовы события «закрыть»

Выход

Затем мы можем выйти из всей программы NodeJS, но только в том случае, если не осталось зарегистрированных обработчиков событий, и это то, что я имею в виду с этой вещью refs equal null здесь. Внутренне NodeJS отслеживает свои открытые прослушиватели событий и в основном имеет счетчик, ссылки или ссылки, которые он увеличивает на 1 для каждого нового зарегистрированного обратного вызова, и он уменьшает этот счетчик на 1 для каждого прослушивателя событий, который ему больше не нужен.

поскольку в серверной среде мы создаем сервер с помощью create server, а затем прослушиваем входящие запросы с прослушиванием, это событие, которое никогда не завершается по умолчанию, и поэтому у нас всегда есть хотя бы одна ссылка, и поэтому мы не существуем в обычная программа веб-сервера узла.

process.exit (refs==0)

Заключение

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

Я вернусь с новой статьей. А пока учись, спрашивай, учи➰.