node.js дочірній процес - різниця між spawn & fork


141

Це може здатися основним питанням, але я не зміг знайти жодної документації:

Яка різниця між розгортанням та нерестуванням процесу node.js? Я читав, що розгортання - це особливий випадок нересту, але які різні випадки використання / повторення для використання кожного з них?

Відповіді:


216

Spawn - це команда, призначена для запуску системних команд. Коли ви запускаєте нерест, ви надсилаєте йому системну команду, яка буде запускатися в його власному процесі, але не виконує жодного подальшого коду у вашому процесі вузла. Ви можете додати слухачів до процесу, який ви породили, щоб дозволити вашому коду взаємодіяти з породженим процесом, але новий екземпляр V8 не створюється (якщо, звичайно, ваша команда не є іншою командою Node, але в цьому випадку ви повинні використовувати fork!) І у процесорі активна лише одна копія вашого модуля вузла.

Fork - це особливий екземпляр нересту, який запускає новий екземпляр двигуна V8. Це означає, що ви можете створити декілька робітників, які працюють на тій же самій кодовій базі вузла або, можливо, інший модуль для конкретного завдання. Це найбільш корисно для створення пулу працівників. Хоча модель події асинхронізації вузла дозволяє використовувати одне ядро ​​машини досить ефективно, воно не дозволяє процесу вузла використовувати багатоядерні машини. Найпростіший спосіб досягти цього - це запустити кілька копій однієї програми на одному процесорі.

Хорошим правилом є один-два вузлові процеси на одне ядро, можливо більше для машин з хорошим співвідношенням тактових частот / процесорних процесорів або для вузлових процесів, важких для вводу / виводу та легкої роботи процесора, щоб мінімізувати час простою події петля чекає нових подій. Однак остання пропозиція є мікрооптимізацією, і вона потребує ретельного бенчмаркінгу, щоб переконатися, що ваша ситуація відповідає потребі багатьох процесів / ядер. Ви можете фактично знизити продуктивність, нерестуючи занадто багато працівників для вашої машини / сценарію.

Зрештою, ви можете використати spawn способом, який зробив вище, надсилаючи spawn команду Node. Але це було б нерозумно, адже fork робить деякі речі для оптимізації процесу створення екземплярів V8. Тільки даючи зрозуміти, що в кінцевому рахунку нерест охоплює вилку. Вилка просто оптимальна для даного конкретного та дуже корисного випадку використання.

http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback


@ChrisCM, якщо я скажу, var child = require('child_process').fork('child.js');наприклад, в основному додатку, у мене зараз будуть працювати два окремі ядра. Якби я запустив важкий цикл для child.js (процес), я б по суті використовував більше ядер для живлення child.js, правда? Чи може це використання процесора впливати на моє основне ядро ​​додатка?
NiCk Newman

2
Неможливо нічого робити на процесорі, не впливаючи на інші речі. Планування, спільне використання кешу, трафік BUS тощо. Однак слід скористатися окремим ядром, а основний цикл запуску НАЙБІЛЬШЕ не впливати. Як і в тому випадку, не такі серйозні негативні наслідки, які ви могли б очікувати від запуску двох процесів на одному і тому ж ядрі процесора. На даний момент дійсно належить до налаштування операційної системи та обладнання, щоб правильно їх оптимізувати. Різні налаштування можуть дати різні результати.
ChrisCM

@ChrisCM Так, я використовую глобальний MonsterLoop для синхронізації позиціонування монстра, і той об'єкт, який він повторює, може становити до 5000 клавіш. Я повторюю це кожні 2 секунди, і роздвоєння здається, що це подрібнення сотень використання пам’яті від мого процесора (головна гра). Я б скоріше зробив це так, замість того, щоб кластеризувати цю петлю і змусити її запустити xx кількість разів на ядро, яке я мав ... Ty для вашого розуміння ~ Тепер я просто не знаю, чи варто мені використовувати Redis або внутрішній IPC: P
NiCk Newman

2
Дякую за те, що звернувся до "чому" - усі публікації, які я читав, поки цей не пропустив цю просту частину пояснення.
aaaaaa

@ChrisCM У відповідь ".. але не виконує жодного подальшого коду у вашому процесі вузла ..". Це означає, що основна нитка чекає і нічого не обробляє. Якщо ТАК, то в чому тут користь використання нересту? ..
Абхі

9

TLDR

Spawn

Коли міцелій створюються - Це створює потоковий інтерфейс між батьківським і дочірнім процесом.

засоби потокового інтерфейсу - буферизація даних у двійковому форматі вONE TIME

Fork

Коли вилка створюється - це створює канал зв'язку між батьком і дочірнім процесом

засоби зв'язку - засоби обміну повідомленнями

Difference

Добре обидва виглядають як одна і та ж передача даних , за винятком різниці

нерест буде корисний, коли ви хочете робити безперервний буфер даних у форматі двійкового / кодування , наприклад - передача 1гб відеофайлу, зображення, файлів журналу вONE TIME

fork стане в нагоді, коли ви хочете робити обмін повідомленнями Eg - JSONабо XMLобмін даними

Conslusion

spawn слід використовувати для потокової передачі великих даних / файлів / зображень ВІД процесу нересту до батьківського процесу

fork має використовуватися для обміну повідомленнями Json / Xml.

  • Наприклад, 10 батьків-процесів створено з батьківського.
  • і кожен процес виконує якусь операцію
  • і кожен процес після завершення операції надсилатиме повідомлення батькові " процес №4 виконано ", " процес №8 виконано "

А як щодо даних безперервного введення даних від батьків до дитини та нарешті всередині файлу?
Ескароут

1
@Esqarrouth, вам потрібно визначити, чи буде це безперервний потік або повідомлення. І ви використовували слово "безперервний логгінг", я вважаю, що ви будете вести wrting до журналів (JSON) для дитини, якщо так, то використовуйте FORKінше, якщо у вас є дуже великий фрагмент даних, які потрібно передати БЮФЕР, то використовуйтеSPAWN
vijay

5
  • spawn - child_process.spawn запускає новий процес із заданою командою.
  • fork - метод child_process.fork - це особливий випадок spawn () для створення дочірніх процесів.

Метод spawn ()

Метод child_process.spawn запускає новий процес із заданою командою. Він має такий підпис -

child_process.spawn(command[, args][, options])

Детальніше про варіанти

Метод spawn () повертає потоки (stdout & stderr), і його слід використовувати, коли процес повертає об'ємну кількість даних. spawn () починає отримувати відповідь, як тільки процес починає виконувати.

Метод вилки ()

Метод child_process.fork - це особливий випадок spawn () для створення процесів Node. Він має такий підпис -

 child_process.fork(modulePath[, args][, options])

Метод fork повертає об'єкт із вбудованим каналом зв’язку на додаток до всіх методів у звичайному екземплярі ChildProcess.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.