Что такое цикл событий и как он отличается от использования других моделей?
Я изучал 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, просто теряете процессор.