Хватая Node JS альтернативу многопоточности

142

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

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

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

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

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

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

Брайан Филд
источник
2
«Узел» не является однопоточным. Только двигатель JS / V8 работает в одном потоке. Libuv часть NodeJS является многопоточным. Смотрите, действительно ли NodeJS однопоточный?
RaelB
1
Подключение stackoverflow.com/q/17959663/632951
Pacerier

Ответы:

87

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

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

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

jcoder
источник
2
Я все еще новичок в Node.js и ценю обсуждение здесь. Я просто хотел отметить, что делать предположения о том, что неблокирующие вызовы поддерживаются многопоточными блокирующими вызовами, вероятно, нецелесообразно (не то, чтобы @jcoder предлагал создавать код на основе этих предположений). В этом случае, даже если IO обрабатывается в отдельном потоке с блокирующим вызовом, этот поток все равно будет в основном ожидать ввода-вывода, поэтому он не будет использовать другие ядра / процессоры. Используйте силу инструментов, которые вы используете, и не беспокойтесь о деталях низкого уровня (пока они не станут проблемой).
wbyoung
так что мы можем делать другие прозы, используя обратный вызов, такой как код JavaScript на
веб-
37

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

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

Майкл Боргвардт
источник
Статья ложная. Хотя многопоточный Apache MPM существует, он несовместим практически со всеми повседневными конфигурациями. Apache является многопроцессорным, а не многопоточным до сих пор, и будет, вероятно, навсегда. Я считаю это катастрофическим, манипулирование правильными значениями терминологии - всего лишь хорошая попытка скрыть проблему, вместо того, чтобы решить ее.
Петер - Восстановить Монику
1
@peterh Ты не имеешь смысла. Статья полностью правильная, утверждая, что apache является многопроцессорным или многопоточным в зависимости от конфигурации. Случай multiproces еще хуже в отношении обработки многих соединений, и это единственная причина, по которой Apache упоминается в первую очередь. Кроме того, очень часто используемый модуль PHP сам по себе является многопоточным. И, наконец, хотя я не специалист по Apache, из других статей у меня сложилось впечатление, что рабочий MPM на самом деле очень часто используется.
Майкл Боргвардт
@MichaelBorgwardt Да, apache может быть многопоточным, а также многопроцессным, я этого не отрицал. Но php несовместим с многопроцессорной конфигурацией, и если вы будете экспертом по Apache, вы наверняка это знаете. Очень часто используемый модуль php не является многопоточным. Ваша информация неверна. Я предлагаю попробовать тестовую конфигурацию, и вы увидите. Это фактическая вещь, не вопрос дебатов, попробуйте, и вы увидите.
Петер - Восстановить Монику
27

Я подумал, что даже если это старый поток, я поделюсь с ним идеей, как использовать более одного ядра в приложении 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())

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

Несколько статей на эту тему:

infografnet
источник
13

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

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

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

Нурай Алтин
источник
1

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

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

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

Саурабх Ленде
источник
2
Это должно быть комментарий
Cherniv