Что такое цикл обработки событий и чем он отличается от использования других моделей? - PullRequest
10 голосов
/ 17 июля 2010

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

Ответы [ 3 ]

17 голосов
/ 17 июля 2010

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

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

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

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

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

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

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

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

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

6 голосов
/ 17 июля 2010

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

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

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

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

0 голосов
/ 29 июля 2010

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

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

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

...