Подтвердить что ты не робот

Почему node.js не подходит для тяжелых приложений CPU?

Node.js очень эффективны в отношении ввода-вывода и большого количества клиентских подключений. Но почему node.js не подходит для тяжелых приложений CPU по сравнению с традиционным многопоточным сервером?

Я прочитал его здесь Феликс Баумгартен

4b9b3361

Ответ 1

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

Учитывая, что вы просто запускаете процесс Node, например, возможно, что несколько процессов Node работают параллельно. Таким образом, вы все равно можете воспользоваться своей многопотоковой архитектурой, хотя ни один процесс Node не работает. Вам просто нужно иметь некоторый балансировщик нагрузки, который распределяет запросы по всем вашим процессам Node.

Другой вариант - заставить процессор работать в отдельных процессах и заставить Node взаимодействовать с ними вместо выполнения самой работы.

Связанные вещи для чтения:

Ответ 2

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

Чтобы справиться с этим, приложения Node.js, которые ожидают большого количества процессора, обычно запускаются в кластерах. Это означает, что вместо нескольких потоков в одном программном пространстве памяти вы запускаете несколько экземпляров одной и той же программы под управлением одного "основного" экземпляра. Каждый процесс является однопоточным, но поскольку у вас их несколько, вы получаете преимущества нескольких потоков.