Захват альтернативы Node JS для многопоточности

Если я правильно понимаю Node JS не блокирует... поэтому вместо ожидания ответа от базы данных или другого процесса он перешел на что-то еще и проверяет позже.

Также он однопоточный.

Таким образом, все это означает, что данный процесс Node JS может полностью и эффективно использовать одно ядро ​​ЦП, но он не будет использовать какое-либо другое ядро ​​на машине, так как он никогда не будет использовать более одного за раз.

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

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

Все ли это правильно? Правильно ли я в своем понимании?

Ответ 1

Довольно верно, да. Сервер node.js имеет внутренний пул потоков, поэтому он может выполнять операции блокировки и уведомлять основной поток с обратным вызовом или событием, когда все заканчивается.

Итак, я предполагаю, что он будет использовать ограниченное использование другого ядра для пула потоков, например, если вы делаете неблокирующую файловую систему, прочитайте это, скорее всего, реализовано путем передачи потока из пула потоков для выполнения чтения и установки обратный вызов, когда это делается, что означает, что чтение может происходить в другом потоке/ядре, в то время как основная программа node.js делает что-то еще.

Но с точки зрения node.js, он полностью однопоточен и не будет напрямую использовать более одного ядра.

Ответ 2

Да, я бы сказал, что ваше понимание совершенно правильно. Эта статья (заархивирована) объясняет обоснование этого проекта совершенно Что ж. Это, вероятно, самый важный параграф:

Apache многопоточен: он генерирует поток для каждого запроса (или процесс, это зависит от conf). Вы можете увидеть, как эти накладные расходы поглощают память, так как количество одновременных подключений увеличивается, и больше потоков необходимо для обслуживания нескольких одновременных клиентов. Nginx и Node.js не являются многопоточными, потому что потоки и процессы несут большую стоимость памяти. Они однопоточные, но основанные на событиях. Это устраняет накладные расходы, создаваемые тысячами потоков/процессов, обрабатывая множество соединений в одном потоке.

Ответ 3

Даже если это старый поток, я подумал, что поделился бы идеей, как использовать больше одного ядра в приложении Node.JS. Как отметил Нурай Алтин, JXcore может это сделать.

Простой пример:

var method = function () {
    console.log("this is message from thread no", process.threadId);
};

jxcore.tasks.runOnThread(0, method);
jxcore.tasks.runOnThread(1, method);

// this is message from thread no 1
// this is message from thread no 0

По умолчанию есть два потока (вы можете изменить его с помощью jxcore.tasks.setThreadCount())

Конечно, есть намного больше, что вы можете делать с задачами. Документы здесь.

Несколько статей по этому вопросу:

Ответ 4

Поскольку этот вопрос задавался почти 2 года назад. Все становится по-другому или существуют альтернативные подходы к проблеме многопоточности на Node.JS

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

http://oguzbastemur.blogspot.com/2013/12/multithread-nodejs.html

Ответ 5

Node.js - однопоточное приложение, но оно может поддерживать concurrency через концепцию события и обратных вызовов. Вот видео от Philip Roberts, в котором объясняется, как циклы событий работают в javascript.

Нажмите здесь, чтобы посмотреть видео

(Вместо WebAPI есть API С++ в Node.js)