Я изучал Узел. JS и вся документация и блоги говорят о том, как это использует цикл событий, а не модель на запрос.
У меня есть некоторый беспорядок, понимая различие. Я чувствую, что я - 80%, там понимая это, но не полностью получение его все же.
Многопоточная модель порождает новый поток для каждого запроса. Это означает, что вы получаете довольно много накладных расходов с точки зрения вычислений и памяти. Цикл событий выполняется в одном потоке, а это означает, что вы не получаете накладных расходов.
В результате вы должны изменить свою модель программирования. Поскольку все эти разные вещи происходят в одном потоке, вы не можете заблокировать. Это означает, что вы не можете ждать, пока что-то произойдет, потому что это заблокирует весь поток. Вместо этого вы определяете обратный вызов, который вызывается после завершения действия. Обычно это называется неблокирующим вводом-выводом .
Псевдо-пример для блокировки ввода-вывода:
row = db_query('SELECT * FROM some_table');
print(row);
Псевдо-пример для неблокирующего ввода-вывода:
db_query('SELECT * FROM some_table', function (row) {
print(row);
});
В этом примере используются лямбда-выражения (анонимные функции), как они постоянно используются в JavaScript. JS интенсивно использует события, и именно об этом говорят обратные вызовы. После завершения действия запускается событие, которое запускает обратный вызов. Вот почему ее часто называют событийной моделью или также асинхронной моделью .
Реализация этой модели использует цикл, который обрабатывает и запускает эти события. Вот почему он называется очередью событий или циклом событий .
Яркие примеры фреймворков очереди событий включают:
Считайте входящие запросы или обратные вызовы событиями, которые ставятся в очередь и обрабатываются.
Это точно то же самое, что делается в большинстве систем с графическим интерфейсом пользователя. Система не может знать, когда пользователь нажмет кнопку или совершит какое-либо взаимодействие. Но когда он это сделает, событие будет передано в цикл событий, который по сути представляет собой цикл, который проверяет наличие новых событий в очереди и обрабатывает их.
Преимущество в том, что вам не нужно ждать результатов для себя. Вместо этого вы регистрируете функции обратного вызова, которые выполняются при запуске события. Это позволяет фреймворку обрабатывать ввод-вывод, и вы можете легко полагаться на его внутреннюю эффективность при работе с длительными действиями вместо того, чтобы самостоятельно блокировать процессы.
Короче говоря, все работает параллельно, кроме вашего кода. Никогда не будет двух фрагментов функций обратного вызова, работающих одновременно - цикл обработки событий представляет собой один поток. Однако процессы, которые выполняют данные извне и, наконец, распространяют события, могут быть распределены по нескольким потокам / процессам.
Выровненный цикл позволяет вам обрабатывать время, необходимое для разговора с жестким диском или сетью. возьмите этот список времени:
Source | CPU Cycles
L1 | 3 Cycles
L2 | 14 Cycles
RAM | 250 Cycles
Disk | 41,000,000 Cycles
Network| 240,000,000 Cycles
Когда вы запускаете curl в PHP, вы просто тратите ресурсы процессора.