Я читал о многопроцессорной обработке на NodeJS, чтобы лучше понять и пытаться добиться хорошей производительности в тяжелых средах с моим кодом.
Хотя я понимаю основную цель c и Для различных способов извлечения выгоды из ресурсов, чтобы справиться с нагрузкой, возникают некоторые вопросы по мере того, как я go глубже, и кажется, что я не могу найти конкретные ответы в документации.
NodeJS в одном потоке:
NodeJS запускает один поток, который мы называем событием l oop, несмотря на то, что в фоновом режиме ОС и Libuv обрабатывают рабочий пул по умолчанию для асинхронных задач ввода-вывода .
Мы должны использовать одно ядро для события-l oop, несмотря на то, что рабочие могут использовать разные ядра. Я предполагаю, что в конце они сортируются планировщиком ОС.
NodeJS как многопоточные:
При использовании библиотеки "worker_threads" в одном и том же процессе Различные экземпляры v8 / Libuv работают для каждого потока. Таким образом, они совместно используют один и тот же контекст и взаимодействуют между потоками с «портом сообщений» и остальной частью API.
Каждый рабочий поток запускает свой поток Event l oop. Предполагается, что потоки должны быть разумно сбалансированы между ядрами процессора, что повышает производительность. Я предполагаю, что в конце они сортируются планировщиком ОС.
Вопрос 1: Когда рабочий использует рабочий пул ввода-вывода по умолчанию, все те же потоки, что и у других рабочих, совместно используются? или каждый работник имеет свой собственный рабочий пул по умолчанию?
NodeJS в мультиобработке:
При использовании библиотеки "cluster" мы разделяем работать среди разных процессов. Каждый процесс настроен на отдельное ядро, чтобы сбалансировать нагрузку ... ну, главное событие l oop - это то, что в итоге устанавливается в другое ядро, поэтому он не разделяет ядро с другим тяжелым событием l oop. Звучит разумно, чтобы сделать это таким образом.
Здесь я хотел бы общаться с некоторыми IP C tacti c.
Вопрос 2: И рабочий пул по умолчанию для этого NodeJS обработать? где они? сбалансирован среди остальных ядер, как и ожидалось в первом случае? Тогда они могут быть на тех же ядрах, что и другие рабочие пулы кластера. Не лучше ли сказать, что мы балансируем основные потоки (циклы событий), а не «процесс»?
С учетом всего сказанного главный вопрос:
Вопрос 3: лучше ли использовать кластеризацию или worker_threads? Если обе используются в одном и том же коде, как обе библиотеки могут достичь наилучшей производительности? или они просто могут просто вступить в конфликт? или, в конце концов, ОС получает контроль?