В вашем примере показано использование модуля throng
. Глядя на его код, он использует модуль nodejs cluster
. Я могу предложить некоторые объяснения как в терминах встроенного nodejs cluster
модуля (который должен применяться к thong
), так и в терминах или встроенного worker_threads
модуля.
кластерный модуль
Кластерный модуль запускает совершенно отдельные процессы. Они не разделяют ни память, ни какие-либо переменные, хотя они настроены таким образом, что могут отправлять дескрипторы сокетов из одного процесса в другой или отправлять друг другу переменные, которые будут скопированы. Если вы определяете константы в коде запуска вашего кластера, те же самые константы будут использоваться в каждом кластере (только потому, что каждый из них запускает один и тот же код запуска и, следовательно, каждый инициализирует себя одинаково). Но если у вас есть глобальная переменная или переменная уровня модуля, которую вы намерены изменить, все внесенные вами изменения будут полностью локальными для этого процесса и не будут отражены в других.
модуль worker_thread
Модуль worker_thread
позволяет запустить один или несколько потоков в одном процессе. Каждый поток является собственным интерпретатором V8, и они по умолчанию не делят какие-либо переменные или память (глобальную или модульную). Переменные, которые вы передаете между основным потоком и рабочим потоком, либо через workerData
, либо через postMessage()
, копируются в отдельные переменные в принимающем потоке. Объекты копируются с помощью структурированного процесса клонирования.
Но они находятся в одном и том же процессе, поэтому выполнение вызова, подобного вызову process.exit()
из рабочего потока, завершит весь процесс (вы можете отдельно убить только этот поток, если вы хочу).
Рабочие потоки могут совместно использовать память, выделяя память как SharedArrayBuffer
, к которой затем могут обращаться все основные потоки и все рабочие. Автоматическая c синхронизация доступа к этой памяти отсутствует, поэтому могут возникнуть ожидаемые проблемы с многопоточным параллелизмом, если только вы не используете некоторые из примитивов синхронизации, которые теперь предлагает nodejs, или если у вас нет такого дизайна, что только один поток в время когда-либо ссылается на эту разделяемую память (это то, что я делал в моем недавнем приложении - передаю sharedArrayBuffer
указанному c работнику для выполнения операции, а затем передает его обратно, когда выполнено с заданием, и основной поток не сохраняет ссылку на него, пока рабочий над ним работает).
Распределенная таким образом память не является набором переменных, это буфер памяти, но вы можете интерпретировать память так, как вы хотите, чтобы она превратилась в определенные c значимые переменные.
Обратите внимание, что разделяемая память автоматически не доступна каждому потоку, но вместо этого вы должны передать ее потоку, либо в начальном workerData
, либо с помощью postMessage()
, прежде чем он получит ссылку на него. sharedMemory буквально выделяется из другой кучи. Я считаю, что он был впервые разработан V8 для использования с webWorkers в браузере, но теперь работает и в node.js.