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

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

У меня есть некоторое замешательство, понимающее разницу. Я чувствую, что я на 80% понимаю его, но не полностью его до сих пор.

Ответ 1

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

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

Псевдо пример блокировки ввода-вывода:

row = db_query('SELECT * FROM some_table');
print(row);

Псевдо пример неблокирующего ввода-вывода:

db_query('SELECT * FROM some_table', function (row) {
  print(row);
});

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

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

Известные примеры фреймворков очереди событий:

Ответ 2

Подумайте о входящих или обратных вызовах как событиях, которые находятся в очереди и обрабатываются.

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

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

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

Ответ 3

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

Source | CPU Cycles
L1     | 3 Cycles
L2     | 14 Cycles
RAM    | 250  Cycles
Disk   | 41,000,000 Cycles
Network| 240,000,000 Cycles

В то время, когда вы запускаете curl в PHP, просто теряете процессор.