Знаю что Node.js использует однопотоковый цикл и цикл обработки событий для обработки запросов, обрабатывающих только по одному за раз. Но все же, как это работает, скажем, 7 000 одновременных запросов. Цикл обработки событий будет обрабатывать все запросы? Разве это не займет слишком много времени?
Я не могу понять , как это может быть быстрее, чем многопоточный веб-сервер. Хотя понимаю, что многопоточный веб-сервер будет дороже в ресурсах (память, процессор), но не будет ли он еще быстрее? Я наверное ошибаюсь; объясните, как этот однопотоковый процесс выполняется быстрее при большом количестве запросов, и что он обычно делает (на низком уровне) ?
Вообще-то всё сильно зависит от того что именно сервер делает с запросами.
Нет никакого абстрактного «быстрее».
Стандартный выигрыш ноды в том, что чаще всего больше всего времени при обработке запроса уходит на IO (файлы, сеть), которые как раз таки выполняются вовсе не в основном потоке. Но писать числодробилку на ноде не нужно.
Lynn «Кофеман», просто сложно вспоминать то, чего никогда не знал
Написано
Решения вопроса 1
Сергей Горностаев
@sergey-gornostaev Куратор тега Асинхронное программирование
Седой и строгий
Самые большие затраты на ввод/вывод. Грубо говоря, если один запрос 90% времени ожидает I/O, то в случае 10 000 конкурентных запросов сервер 9,999% времени находится в ожидании I/O, а асинхронное выполнение позволяет это время использовать с пользой или попросту списать. В то время как многопоточный сервер, обрабатывающий 10k соединений, 90% времени будет тратить на переключение контекста, да и то, если памяти хватит.
Rouslan943, это работает примерно так: вместо того, чтобы постоянно проверять каждый открытый коннект на наличие трафика, реализация использует функцию системы select (или её аналоги, больше почитать тут), которая принимает список файловых дескрипторов и позволяет программе уснуть до наступления событий ввода-вывода. Соответственно, когда в ядре системы случается факт ввод-вывод, относящийся к любому из этих файловых дескрипторов, ядро пробуждает программу и возвращает эти события. За счёт этого можно реагировать на трафик практически без расхода процессорного времени.