Spec-Zone.ru › Node.js

Кластер

Исходный код: lib/cluster.js

Стабильность: 2 — Стабильный

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

Модуль cluster позволяет легко создавать дочерние процессы, использующие одни и те же порты сервера.

Модули JavaScript
import cluster from 'node:cluster';
import http from 'node:http';
import { availableParallelism } from 'node:os';
import process from 'node:process';

const numCPUs = availableParallelism();

if (cluster.isPrimary) {
  console.log(`Primary ${process.pid} is running`);

  // Fork workers.
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`);
  });
} else {
  // Workers can share any TCP connection
  // In this case it is an HTTP server
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('hello world\n');
  }).listen(8000);

  console.log(`Worker ${process.pid} started`);
}
CommonJS
const cluster = require('node:cluster');
const http = require('node:http');
const numCPUs = require('node:os').availableParallelism();

if (cluster.isPrimary) {
  console.log(`Primary ${process.pid} is running`);

  // Fork workers.
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`);
  });
} else {
  // Workers can share any TCP connection
  // In this case it is an HTTP server
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('hello world\n');
  }).listen(8000);

  console.log(`Worker ${process.pid} started`);
}

Теперь запущенные процессы Node.js будут совместно использовать порт 8000:

$ node server.js
Primary 3596 is running
Worker 4324 started
Worker 4520 started
Worker 6056 started
Worker 5644 started
consolecopy

В Windows пока невозможно настроить сервер именованного канала в рабочем процессе.

Как это работает

Рабочие процессы запускаются с помощью метода child_process.fork(), чтобы они могли взаимодействовать с родительским процессом через IPC и передавать дескрипторы сервера в обоих направлениях.

Модуль cluster поддерживает два способа распределения входящих подключений.

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

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

Теоретически второй способ должен обеспечивать наилучшую производительность. Однако на практике распределение часто оказывается очень неравномерным из-за особенностей планировщика операционной системы. Наблюдались случаи, когда более 70% всех подключений приходилось всего на два процесса из восьми.

Поскольку server.listen() передает большую часть работы основному процессу, есть три случая, в которых поведение обычного процесса Node.js отличается от поведения рабочего процесса кластера:

  1. server.listen({fd: 7}) Поскольку сообщение передается основному процессу, прослушиваться будет файловый дескриптор 7 в родительском процессе, а его дескриптор будет передан рабочему процессу. Таким образом, будет использоваться не то, на что, по мнению рабочего процесса, ссылается файловый дескриптор с номером 7.
  2. server.listen(handle) Явное прослушивание дескрипторов приведет к тому, что рабочий процесс будет использовать переданный дескриптор, а не обращаться к основному процессу.
  3. server.listen(0) Обычно это приводит к тому, что серверы прослушивают случайный порт. Однако в кластере каждый рабочий процесс будет получать один и тот же «случайный» порт при каждом вызове listen(0). По сути, порт случаен при первом вызове, но предсказуем при последующих. Чтобы прослушивать уникальный порт, сформируйте его номер на основе идентификатора рабочего процесса кластера.

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

Поскольку все рабочие процессы являются отдельными процессами, их можно завершать или запускать заново в соответствии с потребностями программы, не затрагивая другие рабочие процессы. Пока работают некоторые рабочие процессы, сервер продолжит принимать подключения. Если не работает ни один рабочий процесс, существующие подключения будут разорваны, а новые отклонены. Однако Node.js автоматически не управляет количеством рабочих процессов. Приложение должно самостоятельно управлять пулом рабочих процессов в соответствии со своими потребностями.

Хотя основным сценарием использования модуля node:cluster является работа с сетью, его можно использовать и в других сценариях, требующих рабочих процессов.

Класс: Worker

Добавлен в: v0.7.0
  • Наследует: <EventEmitter>

Объект Worker содержит общедоступную информацию о рабочем процессе и его методы. В основном процессе его можно получить с помощью cluster.workers. В рабочем процессе его можно получить с помощью cluster.worker.

Событие: 'disconnect'

Добавлено в: v0.7.7

Аналогично событию cluster.on('disconnect'), но относится только к этому рабочему процессу.

cluster.fork().on('disconnect', () => {
  // Worker has disconnected
});
jscopy

Событие: 'error'

Добавлено в: v0.7.3

Это событие совпадает с событием, предоставляемым модулем child_process.fork().

В рабочем процессе также можно использовать process.on('error').

Событие: 'exit'

Добавлено в: v0.11.2
  • code <number> Код завершения, если процесс завершился нормально.
  • signal <string> Имя сигнала (например, 'SIGHUP'), из-за которого процесс был завершен.

Аналогично событию cluster.on('exit'), но относится только к этому рабочему процессу.

Модули JavaScript
import cluster from 'node:cluster';

if (cluster.isPrimary) {
  const worker = cluster.fork();
  worker.on('exit', (code, signal) => {
    if (signal) {
      console.log(`worker was killed by signal: ${signal}`);
    } else if (code !== 0) {
      console.log(`worker exited with error code: ${code}`);
    } else {
      console.log('worker success!');
    }
  });
}
CommonJS
const cluster = require('node:cluster');

if (cluster.isPrimary) {
  const worker = cluster.fork();
  worker.on('exit', (code, signal) => {
    if (signal) {
      console.log(`worker was killed by signal: ${signal}`);
    } else if (code !== 0) {
      console.log(`worker exited with error code: ${code}`);
    } else {
      console.log('worker success!');
    }
  });
}

Событие: 'listening'

Добавлено в: v0.7.0
  • address <Object>

Аналогично событию cluster.on('listening'), но относится только к этому рабочему процессу.

Модули JavaScript
cluster.fork().on('listening', (address) => {
  // Worker is listening
});
CommonJS
cluster.fork().on('listening', (address) => {
  // Worker is listening
});

В рабочем процессе это событие не генерируется.

Событие: 'message'

Добавлено в: v0.7.0
  • message <Object>
  • handle <undefined> | <Object>

Аналогично событию 'message' объекта cluster, но относится только к этому рабочему процессу.

В рабочем процессе также можно использовать process.on('message').

См. событие 'message': process.

Ниже приведен пример использования системы сообщений. В нем основной процесс ведет счетчик количества HTTP-запросов, полученных рабочими процессами:

Модули JavaScript
import cluster from 'node:cluster';
import http from 'node:http';
import { availableParallelism } from 'node:os';
import process from 'node:process';

if (cluster.isPrimary) {

  // Keep track of http requests
  let numReqs = 0;
  setInterval(() => {
    console.log(`numReqs = ${numReqs}`);
  }, 1000);

  // Count requests
  function messageHandler(msg) {
    if (msg.cmd && msg.cmd === 'notifyRequest') {
      numReqs += 1;
    }
  }

  // Start workers and listen for messages containing notifyRequest
  const numCPUs = availableParallelism();
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  for (const id in cluster.workers) {
    cluster.workers[id].on('message', messageHandler);
  }

} else {

  // Worker processes have a http server.
  http.Server((req, res) => {
    res.writeHead(200);
    res.end('hello world\n');

    // Notify primary about the request
    process.send({ cmd: 'notifyRequest' });
  }).listen(8000);
}
CommonJS
const cluster = require('node:cluster');
const http = require('node:http');
const numCPUs = require('node:os').availableParallelism();

if (cluster.isPrimary) {

  // Keep track of http requests
  let numReqs = 0;
  setInterval(() => {
    console.log(`numReqs = ${numReqs}`);
  }, 1000);

  // Count requests
  function messageHandler(msg) {
    if (msg.cmd && msg.cmd === 'notifyRequest') {
      numReqs += 1;
    }
  }

  // Start workers and listen for messages containing notifyRequest
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  for (const id in cluster.workers) {
    cluster.workers[id].on('message', messageHandler);
  }

} else {

  // Worker processes have a http server.
  http.Server((req, res) => {
    res.writeHead(200);
    res.end('hello world\n');

    // Notify primary about the request
    process.send({ cmd: 'notifyRequest' });
  }).listen(8000);
}

Событие: 'online'

Добавлено в: v0.7.0

Аналогично событию cluster.on('online'), но относится только к этому рабочему процессу.

cluster.fork().on('online', () => {
  // Worker is online
});
jscopy

В рабочем процессе это событие не генерируется.

worker.disconnect()

Добавлен в: v0.7.7
История
Версия Изменения
v7.3.0

Теперь этот метод возвращает ссылку на worker.

  • Возвращает: <cluster.Worker> Ссылку на worker.

В рабочем процессе эта функция закрывает все серверы, ожидает события 'close' на этих серверах, а затем отключает канал IPC.

В основном процессе рабочему процессу отправляется внутреннее сообщение, которое вызывает .disconnect() в самом рабочем процессе.

Устанавливает значение .exitedAfterDisconnect.

После закрытия сервера он перестанет принимать новые подключения, но подключения могут принимать другие прослушивающие рабочие процессы. Существующим подключениям будет позволено закрыться обычным образом. Когда подключений больше не останется, см. server.close(), канал IPC рабочего процесса закроется, что позволит ему корректно завершиться.

Описанное выше относится только к подключениям сервера. Рабочие процессы автоматически не закрывают клиентские подключения, и отключение не ожидает их закрытия перед завершением процесса.

В рабочем процессе существует process.disconnect, но это не данная функция, а disconnect().

Поскольку длительные подключения к серверу могут препятствовать отключению рабочих процессов, может быть полезно отправить сообщение, чтобы приложение выполнило необходимые действия для их закрытия. Также может быть полезно реализовать тайм-аут, завершающий рабочий процесс, если по истечении заданного времени событие 'disconnect' не было сгенерировано.

if (cluster.isPrimary) {
  const worker = cluster.fork();
  let timeout;

  worker.on('listening', (address) => {
    worker.send('shutdown');
    worker.disconnect();
    timeout = setTimeout(() => {
      worker.kill();
    }, 2000);
  });

  worker.on('disconnect', () => {
    clearTimeout(timeout);
  });

} else if (cluster.isWorker) {
  const net = require('node:net');
  const server = net.createServer((socket) => {
    // Connections never end
  });

  server.listen(8000);

  process.on('message', (msg) => {
    if (msg === 'shutdown') {
      // Initiate graceful close of any connections to server
    }
  });
}
jscopy

worker.exitedAfterDisconnect

Добавлено в: v6.0.0
  • Тип: <boolean>

Это свойство имеет значение true, если рабочий процесс завершился из-за .disconnect(). Если рабочий процесс завершился по любой другой причине, оно имеет значение false. Если рабочий процесс еще не завершился, оно имеет значение undefined.

Логическое свойство worker.exitedAfterDisconnect позволяет отличить штатное завершение от неожиданного. Основной процесс может решить не перезапускать рабочий процесс на основе этого значения.

cluster.on('exit', (worker, code, signal) => {
  if (worker.exitedAfterDisconnect === true) {
    console.log('Oh, it was just voluntary – no need to worry');
  }
});

// kill worker
worker.kill();
jscopy

worker.id

Добавлено в: v0.8.0
  • Тип: <integer>

Каждому новому рабочему процессу присваивается уникальный идентификатор, который хранится в id.

Пока рабочий процесс работает, этот ключ используется для поиска его в cluster.workers.

worker.isConnected()

Добавлено в: v0.11.14

Эта функция возвращает true, если рабочий процесс подключен к основному процессу через канал IPC, и false в противном случае. Рабочий процесс подключается к основному процессу после создания. Отключение происходит после генерации события 'disconnect'.

worker.isDead()

Добавлено в: v0.11.14

Эта функция возвращает true, если процесс рабочего процесса завершился (в результате выхода или получения сигнала). В противном случае она возвращает false.

Модули JavaScript
import cluster from 'node:cluster';
import http from 'node:http';
import { availableParallelism } from 'node:os';
import process from 'node:process';

const numCPUs = availableParallelism();

if (cluster.isPrimary) {
  console.log(`Primary ${process.pid} is running`);

  // Fork workers.
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('fork', (worker) => {
    console.log('worker is dead:', worker.isDead());
  });

  cluster.on('exit', (worker, code, signal) => {
    console.log('worker is dead:', worker.isDead());
  });
} else {
  // Workers can share any TCP connection. In this case, it is an HTTP server.
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end(`Current process\n ${process.pid}`);
    process.kill(process.pid);
  }).listen(8000);
}
CommonJS
const cluster = require('node:cluster');
const http = require('node:http');
const numCPUs = require('node:os').availableParallelism();

if (cluster.isPrimary) {
  console.log(`Primary ${process.pid} is running`);

  // Fork workers.
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('fork', (worker) => {
    console.log('worker is dead:', worker.isDead());
  });

  cluster.on('exit', (worker, code, signal) => {
    console.log('worker is dead:', worker.isDead());
  });
} else {
  // Workers can share any TCP connection. In this case, it is an HTTP server.
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end(`Current process\n ${process.pid}`);
    process.kill(process.pid);
  }).listen(8000);
}

worker.kill([signal])

Добавлено в: v0.9.12
  • signal <string> Имя сигнала завершения, отправляемого процессу рабочего процесса. По умолчанию: 'SIGTERM'

Эта функция завершает рабочий процесс. В основном процессе это происходит путем отключения worker.process, а после отключения — завершения с помощью signal. В рабочем процессе процесс завершается с помощью signal.

Функция kill() завершает процесс рабочего процесса, не дожидаясь штатного отключения; ее поведение совпадает с поведением worker.process.kill().

Для обратной совместимости этот метод также доступен под именем worker.destroy().

В рабочем процессе существует process.kill(), но это не данная функция, а kill().

worker.process

Добавлено в: v0.7.0
  • Тип: <ChildProcess>

Все рабочие процессы создаются с помощью child_process.fork(), а возвращенный этой функцией объект сохраняется как .process. В рабочем процессе сохраняется глобальный объект process.

См.: Модуль дочерних процессов.

Рабочие процессы вызывают process.exit(0), если на process генерируется событие 'disconnect', а .exitedAfterDisconnect не имеет значения true. Это защищает от случайного отключения.

worker.send(message[, sendHandle[, options]][, callback])

Добавлено в: v0.7.0
История
Версия Изменения
v4.0.0

Теперь поддерживается параметр callback.

  • message <Object>
  • sendHandle <Handle>
  • options <Object> Аргумент options, если он указан, представляет собой объект, используемый для настройки отправки некоторых типов дескрипторов. options поддерживает следующие свойства:
    • keepOpen <boolean> Значение, используемое при передаче экземпляров net.Socket. Если задано true, сокет остается открытым в отправляющем процессе. По умолчанию: false.
  • callback <Function>
  • Возвращает: <boolean>

Отправляет сообщение рабочему или основному процессу, при необходимости передавая дескриптор.

В основном процессе отправляет сообщение определенному рабочему процессу. Поведение совпадает с поведением метода ChildProcess.send().

В рабочем процессе отправляет сообщение основному процессу. Поведение совпадает с поведением process.send().

В этом примере все сообщения от основного процесса отправляются обратно:

if (cluster.isPrimary) {
  const worker = cluster.fork();
  worker.send('hi there');

} else if (cluster.isWorker) {
  process.on('message', (msg) => {
    process.send(msg);
  });
}
jscopy

Событие: 'disconnect'

Добавлено в: v0.7.9
  • worker <cluster.Worker>

Генерируется после отключения канала IPC рабочего процесса. Это может произойти при штатном завершении рабочего процесса, его принудительном завершении или отключении вручную (например, с помощью worker.disconnect()).

Между событиями 'disconnect' и 'exit' может пройти некоторое время. Эти события можно использовать, чтобы определить, завис ли процесс во время очистки или существуют ли длительные подключения.

cluster.on('disconnect', (worker) => {
  console.log(`The worker #${worker.id} has disconnected`);
});
jscopy

Событие: 'exit'

Добавлено в: v0.7.9
  • worker <cluster.Worker>
  • code <number> Код завершения, если процесс завершился нормально.
  • signal <string> Имя сигнала (например, 'SIGHUP'), из-за которого процесс был завершен.

При завершении любого рабочего процесса модуль cluster генерирует событие 'exit'.

Это событие можно использовать для перезапуска рабочего процесса, повторно вызвав .fork().

cluster.on('exit', (worker, code, signal) => {
  console.log('worker %d died (%s). restarting...',
              worker.process.pid, signal || code);
  cluster.fork();
});
jscopy

См. событие 'exit': child_process.

Событие: 'fork'

Добавлено в: v0.7.0
  • worker <cluster.Worker>

При создании нового рабочего процесса модуль cluster генерирует событие 'fork'. Его можно использовать для регистрации активности рабочих процессов и создания пользовательского тайм-аута.

const timeouts = [];
function errorMsg() {
  console.error('Something must be wrong with the connection ...');
}

cluster.on('fork', (worker) => {
  timeouts[worker.id] = setTimeout(errorMsg, 2000);
});
cluster.on('listening', (worker, address) => {
  clearTimeout(timeouts[worker.id]);
});
cluster.on('exit', (worker, code, signal) => {
  clearTimeout(timeouts[worker.id]);
  errorMsg();
});
jscopy

Событие: 'listening'

Добавлено в: v0.7.0
  • worker <cluster.Worker>
  • address <Object>

После вызова listen() из рабочего процесса, когда на сервере генерируется событие 'listening', в основном процессе также будет сгенерировано событие 'listening' для объекта cluster.

Обработчик события вызывается с двумя аргументами: worker содержит объект рабочего процесса, а объект address содержит следующие свойства подключения: address, port и addressType. Это особенно полезно, если рабочий процесс прослушивает более одного адреса.

cluster.on('listening', (worker, address) => {
  console.log(
    `A worker is now connected to ${address.address}:${address.port}`);
});
jscopy

Свойство addressType может иметь одно из следующих значений:

  • 4 (TCPv4)
  • 6 (TCPv6)
  • -1 (сокет домена Unix)
  • 'udp4' или 'udp6' (UDPv4 или UDPv6)

Событие: 'message'

Добавлено в: v2.5.0
История
Версия Изменения
v6.0.0

Теперь передается параметр worker; подробности см. ниже.

  • worker <cluster.Worker>
  • message <Object>
  • handle <undefined> | <Object>

Генерируется, когда основной процесс кластера получает сообщение от любого рабочего процесса.

См. событие 'message': child_process.

Событие: 'online'

Добавлено в: v0.7.0
  • worker <cluster.Worker>

После создания нового рабочего процесса он должен ответить сообщением о переходе в онлайн-режим. Получив такое сообщение, основной процесс сгенерирует это событие. Разница между событиями 'fork' и 'online' заключается в том, что событие fork генерируется при создании рабочего процесса основным процессом, а 'online' — когда рабочий процесс начинает работу.

cluster.on('online', (worker) => {
  console.log('Yay, the worker responded after it was forked');
});
jscopy

Событие: 'setup'

Добавлено в: v0.7.1
  • settings <Object>

Генерируется при каждом вызове .setupPrimary().

Объект settings — это объект cluster.settings на момент вызова .setupPrimary(). Он носит только рекомендательный характер, поскольку за один тик можно несколько раз вызвать .setupPrimary().

Если важна точность, используйте cluster.settings.

cluster.disconnect([callback])

Добавлено в: v0.7.7
  • callback <Function> Вызывается после отключения всех рабочих процессов и закрытия дескрипторов.

Вызывает .disconnect() для каждого рабочего процесса в cluster.workers.

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

Методу можно передать необязательный аргумент — функцию обратного вызова, которая будет вызвана после завершения операции.

Вызывать этот метод можно только из основного процесса.

cluster.fork([env])

Добавлено в: v0.6.0
  • env <Object> Пары ключ-значение, добавляемые в окружение процесса рабочего процесса.
  • Возвращает: <cluster.Worker>

Запускает новый процесс рабочего процесса.

Вызывать эту функцию можно только из основного процесса.

cluster.isMaster

Добавлено в: v0.8.1Устарело в: v16.0.0

Стабильность: 0 — Устарело

Устаревший псевдоним для cluster.isPrimary.

cluster.isPrimary

Добавлено в: v16.0.0
  • Тип: <boolean>

Имеет значение true, если процесс является основным. Это определяется переменной process.env.NODE_UNIQUE_ID. Если process.env.NODE_UNIQUE_ID не определена, то isPrimary имеет значение true.

cluster.isWorker

Добавлено в: v0.6.0
  • Тип: <boolean>

Имеет значение true, если процесс не является основным (то есть является отрицанием cluster.isPrimary).

cluster.schedulingPolicy

Добавлено в: v0.11.2

Политика планирования: cluster.SCHED_RR для циклического распределения или cluster.SCHED_NONE, чтобы передать выбор операционной системе. Это глобальная настройка, которая фактически фиксируется после запуска первого рабочего процесса или вызова .setupPrimary() — в зависимости от того, что произойдет раньше.

Во всех операционных системах, кроме Windows, по умолчанию используется SCHED_RR. В Windows значение изменится на SCHED_RR, когда libuv сможет эффективно распределять дескрипторы IOCP без значительного снижения производительности.

Значение cluster.schedulingPolicy также можно задать с помощью переменной окружения NODE_CLUSTER_SCHED_POLICY. Допустимые значения: 'rr' и 'none'.

cluster.settings

Добавлено в: v0.7.1
История
Версия Изменения
v13.2.0, v12.16.0

Теперь поддерживается параметр serialization.

v9.5.0

Теперь поддерживается параметр cwd.

v9.4.0

Теперь поддерживается параметр windowsHide.

v8.2.0

Теперь поддерживается параметр inspectPort.

v6.4.0

Теперь поддерживается параметр stdio.

  • Тип: <Object>
    • execArgv <string[]> Список строковых аргументов, передаваемых исполняемому файлу Node.js. По умолчанию: process.execArgv.
    • exec <string> Путь к файлу рабочего процесса. По умолчанию: process.argv[1].
    • args <string[]> Строковые аргументы, передаваемые рабочему процессу. По умолчанию: process.argv.slice(2).
    • cwd <string> Текущий рабочий каталог процесса рабочего процесса. По умолчанию: undefined (наследуется от родительского процесса).
    • serialization <string> Задает способ сериализации сообщений между процессами. Возможные значения: 'json' и 'advanced'. Дополнительные сведения см. в разделе Расширенная сериализация для child_process. По умолчанию: false.
    • silent <boolean> Определяет, отправлять ли вывод в стандартные потоки родительского процесса. По умолчанию: false.
    • stdio <Array> Настраивает стандартные потоки создаваемых процессов. Поскольку для работы модуля cluster требуется IPC, эта конфигурация должна содержать запись 'ipc'. Если указано это свойство, оно переопределяет silent. См. свойство stdio метода child_process.spawn().
    • uid <number> Задает идентификатор пользователя процесса. (См. setuid(2).)
    • gid <number> Задает идентификатор группы процесса. (См. setgid(2).)
    • inspectPort <number> | <Function> Задает порт инспектора рабочего процесса. Это может быть число или функция без аргументов, возвращающая число. По умолчанию каждому рабочему процессу назначается собственный порт, начиная с process.debugPort основного процесса и увеличивая его.
    • windowsHide <boolean> Скрывает окно консоли создаваемого процесса, которое обычно появляется в Windows. По умолчанию: false.

После вызова .setupPrimary() (или .fork()) этот объект настроек будет содержать параметры, в том числе значения по умолчанию.

Этот объект не предназначен для изменения или задания вручную.

cluster.setupMaster([settings])

Добавлено в: v0.7.1Устарело в: v16.0.0
История
Версия Изменения
v6.4.0

Теперь поддерживается параметр stdio.

Стабильность: 0 — Устарело

Устаревший псевдоним для .setupPrimary().

cluster.setupPrimary([settings])

Добавлено в: v16.0.0
  • settings <Object> См. cluster.settings.

setupPrimary используется для изменения поведения «fork» по умолчанию. После вызова настройки будут доступны в cluster.settings.

Изменения настроек влияют только на будущие вызовы .fork() и не влияют на уже работающие рабочие процессы.

Единственный атрибут рабочего процесса, который нельзя задать с помощью .setupPrimary(), — это env, передаваемый в .fork().

Указанные выше значения по умолчанию применяются только к первому вызову; для последующих вызовов значениями по умолчанию будут текущие значения на момент вызова cluster.setupPrimary().

Модули JavaScript
import cluster from 'node:cluster';

cluster.setupPrimary({
  exec: 'worker.js',
  args: ['--use', 'https'],
  silent: true,
});
cluster.fork(); // https worker
cluster.setupPrimary({
  exec: 'worker.js',
  args: ['--use', 'http'],
});
cluster.fork(); // http worker
CommonJS
const cluster = require('node:cluster');

cluster.setupPrimary({
  exec: 'worker.js',
  args: ['--use', 'https'],
  silent: true,
});
cluster.fork(); // https worker
cluster.setupPrimary({
  exec: 'worker.js',
  args: ['--use', 'http'],
});
cluster.fork(); // http worker

Этот метод можно вызвать только из основного процесса.

cluster.worker

Добавлено в: v0.7.0
  • Тип: <Object>

Ссылка на объект текущего рабочего процесса. Недоступна в основном процессе.

Модули JavaScript
import cluster from 'node:cluster';

if (cluster.isPrimary) {
  console.log('I am primary');
  cluster.fork();
  cluster.fork();
} else if (cluster.isWorker) {
  console.log(`I am worker #${cluster.worker.id}`);
}
CommonJS
const cluster = require('node:cluster');

if (cluster.isPrimary) {
  console.log('I am primary');
  cluster.fork();
  cluster.fork();
} else if (cluster.isWorker) {
  console.log(`I am worker #${cluster.worker.id}`);
}

cluster.workers

Добавлено в: v0.7.0
  • Тип: <Object>

Хеш-таблица, в которой хранятся активные объекты рабочих процессов с ключами по полю id. Это упрощает перебор всех рабочих процессов. Доступна только в основном процессе.

Рабочий процесс удаляется из cluster.workers после отключения и завершения. Заранее определить порядок этих двух событий невозможно. Однако гарантируется, что удаление из списка cluster.workers происходит до отправки последнего события 'disconnect' или 'exit'.

Модули JavaScript
import cluster from 'node:cluster';

for (const worker of Object.values(cluster.workers)) {
  worker.send('big announcement to all workers');
}
CommonJS
const cluster = require('node:cluster');

for (const worker of Object.values(cluster.workers)) {
  worker.send('big announcement to all workers');
}

© Joyent, Inc. and other Node contributors
Licensed under the MIT License.
Node.js is a trademark of Joyent, Inc. and is used with its permission.
We are not endorsed by or affiliated with Joyent.
https://nodejs.org/api/cluster.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API