@kirill-93

Вопрос про многопоточность и работу ядер процессора и nodejs?

Здравствуйте!
Помогите, пожалуйста, внести ясность и понять, как именно работает современный многоядерный процессор.
Допустим, есть скрипт, который на сервере работает. Раньше, когда ядро у процессора было одно, все было ясно - процессор обрабатывает скрипт в один поток последовательно.
Затем появились многоядерные процессоры, которые могут распараллеливать и одновременно выполнять несколько скриптов (каждое ядро независимо от других может что-то выполнять).
Тут же появились языки программирования и инструменты, которые умеют работать с многопоточностью. Если представить очень грубо, то работа заключается в умении"раздавать" задачи нескольким ядрам, а затем собирать результат работы каждого ядра и "склеивать" его в конечный результат. Например, если скрипт состоит из четырех сложных вычислений, каждое их которых занимает 1 секунду, то одноядерный процессор выполнял бы эти вычисления по очереди и всего потратил бы 4 секунды. А четырехядерный процессор возьмет по одному вычислению на каждое ядро, параллельно выполнит все 4 расчета за 1 секунду и отдаст результат за 1 секунду. Ну это если очень грубо представить.
С этим все более-менее понятно. Но выше речь шла об умении ЯП задействовать ядра процессора на усмотрение программиста, который пишет программу. А как будет происходить работа в следующем случае:
Я пишу скрипт на nodejs + websocket. Это будет онлайн-чат. Один человек пишет сообщение, другой его получает и тд. Будут ли в этом случае задействованы все ядра процессора? Если да, то как? Nodejs из коробки запускается и задействует все ядра?
Если я проведу аналогию с PHP (а больше я, к сожалению, ни с чем пока не работал), то в PHP скрипт каждый раз "запускается" и "умирает". У него нет состояния. Пришел запрос от пользователья - запустился скрипт, подключился к базе, записал туда что-нибудь и умер. Поэтому каждый новый запрос может брать на себя другое ядро. А в nodejs есть это самое "состояние". То есть программа запущена и данные одни на всех.
let users: [];
let messages: [];

ws.on('connection', socket=> {
    users.push(socket);
  
    socket.on('message', message => {
        messages.push(message);

        users.forEach(user => user.emit('message', message));
    });
});


Как в этом случае запросы будут обрабатываться параллельно? Они ведь работают с одними и теми же данными.
Объясните, пожалуйста.
  • Вопрос задан
  • 801 просмотр
Пригласить эксперта
Ответы на вопрос 1
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
https://nodejs.org/api/worker_threads.html По хорошему нода равномерно распределяет задачи по ядрам. Но ваша задача грамотно использовать это.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы