Skip to content

Cluster

[Stable: 2 - 安定]

Stable: 2 Stability: 2 - 安定

ソースコード: lib/cluster.js

Node.js プロセスのクラスタは、アプリケーションスレッド間でワークロードを分散できる Node.js の複数のインスタンスを実行するために使用できます。プロセス分離が必要ない場合は、代わりに worker_threads モジュールを使用してください。これにより、単一の Node.js インスタンス内で複数のアプリケーションスレッドを実行できます。

cluster モジュールを使用すると、サーバーポートをすべて共有する子プロセスを簡単に作成できます。

js
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`);
}
js
const cluster = require('node:cluster');
const http = require('node:http');
const numCPUs = require('node:os').availableParallelism();
const process = require('node:process');

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 が共有されるようになります。

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

Windows では、まだワーカーで名前付きパイプサーバーをセットアップすることはできません。

仕組み

ワーカープロセスは、child_process.fork() メソッドを使用して生成されます。これにより、IPCを介して親プロセスと通信し、サーバーハンドルをやり取りできます。

clusterモジュールは、受信接続を分散する2つの方法をサポートしています。

1つ目の方法(およびWindowsを除くすべてのプラットフォームでのデフォルトの方法)は、ラウンドロビン方式です。プライマリプロセスがポートをリッスンし、新しい接続を受け入れ、ワーカープロセスにラウンドロビン方式で分散します。ワーカープロセスへの過負荷を避けるための組み込みの賢さも備わっています。

2つ目の方法は、プライマリプロセスがlistenソケットを作成し、それを関心のあるワーカーに送信する方法です。次に、ワーカーは受信接続を直接受け入れます。

理論的には、2つ目の方法が最高のパフォーマンスを発揮するはずです。しかし実際には、オペレーティングシステムのスケジューラによる気まぐれにより、分散が非常に不均衡になる傾向があります。8つのプロセスのうち、70%を超える接続がわずか2つのプロセスに集中していることが観測されています。

server.listen() はほとんどの作業をプライマリプロセスに委ねるため、通常の Node.js プロセスとクラスターワーカーの間で動作が異なるケースが3つあります。

Node.js はルーティングロジックを提供しません。したがって、セッションやログインなどのために、インメモリデータオブジェクトに過度に依存しないようにアプリケーションを設計することが重要です。

ワーカーはすべて別のプロセスであるため、他のワーカーに影響を与えることなく、プログラムのニーズに応じてkillまたは再生成できます。生きているワーカーがいくつか存在する限り、サーバーは接続を受け入れ続けます。ワーカーが1つも存在しない場合、既存の接続は切断され、新しい接続は拒否されます。ただし、Node.js はワーカーの数を自動的に管理しません。独自のニーズに基づいてワーカープールを管理するのは、アプリケーションの責任です。

node:cluster モジュールの主なユースケースはネットワーキングですが、ワーカープロセスを必要とする他のユースケースにも使用できます。

クラス: Worker

追加: v0.7.0

Worker オブジェクトは、ワーカーに関するすべての公開情報とメソッドを含みます。プライマリでは、cluster.workers を使用して取得できます。ワーカーでは、cluster.worker を使用して取得できます。

イベント: 'disconnect'

追加: v0.7.7

cluster.on('disconnect') イベントと同様ですが、このワーカーに固有です。

js
cluster.fork().on('disconnect', () => {
  // Worker が切断されました
});

イベント: 'error'

追加: v0.7.3

このイベントは、child_process.fork() によって提供されるものと同じです。

ワーカー内では、process.on('error') も使用できます。

イベント: 'exit'

追加: v0.11.2

  • code <number> 正常に終了した場合の終了コード。
  • signal <string> プロセスが強制終了された原因となったシグナルの名前 (例: 'SIGHUP')。

cluster.on('exit') イベントと同様ですが、このワーカーに固有です。

js
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!');
    }
  });
}
js
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

cluster.on('listening') イベントと同様ですが、このワーカーに固有です。

js
cluster.fork().on('listening', (address) => {
  // Worker がリッスンしています
});
js
cluster.fork().on('listening', (address) => {
  // Worker がリッスンしています
});

ワーカー内では発行されません。

イベント: 'message'

追加: v0.7.0

cluster'message' イベントに似ていますが、このワーカーに固有です。

ワーカー内では、process.on('message') も使用できます。

process イベント: 'message' を参照してください。

以下は、メッセージシステムを使用する例です。これは、ワーカーが受信した HTTP リクエストの数をプライマリプロセスでカウントし続けます。

js
import cluster from 'node:cluster';
import http from 'node:http';
import { availableParallelism } from 'node:os';
import process from 'node:process';

if (cluster.isPrimary) {

  // HTTPリクエストを追跡
  let numReqs = 0;
  setInterval(() => {
    console.log(`numReqs = ${numReqs}`);
  }, 1000);

  // リクエストをカウント
  function messageHandler(msg) {
    if (msg.cmd && msg.cmd === 'notifyRequest') {
      numReqs += 1;
    }
  }

  // ワーカーを起動し、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 {

  // ワーカープロセスはHTTPサーバーを持っています。
  http.Server((req, res) => {
    res.writeHead(200);
    res.end('hello world\n');

    // リクエストについてプライマリに通知する
    process.send({ cmd: 'notifyRequest' });
  }).listen(8000);
}
js
const cluster = require('node:cluster');
const http = require('node:http');
const numCPUs = require('node:os').availableParallelism();
const process = require('node:process');

if (cluster.isPrimary) {

  // HTTPリクエストを追跡
  let numReqs = 0;
  setInterval(() => {
    console.log(`numReqs = ${numReqs}`);
  }, 1000);

  // リクエストをカウント
  function messageHandler(msg) {
    if (msg.cmd && msg.cmd === 'notifyRequest') {
      numReqs += 1;
    }
  }

  // ワーカーを起動し、notifyRequestを含むメッセージをリッスンする
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

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

} else {

  // ワーカープロセスはHTTPサーバーを持っています。
  http.Server((req, res) => {
    res.writeHead(200);
    res.end('hello world\n');

    // リクエストについてプライマリに通知する
    process.send({ cmd: 'notifyRequest' });
  }).listen(8000);
}

イベント: 'online'

追加: v0.7.0

cluster.on('online') イベントと同様ですが、このワーカーに固有のイベントです。

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

ワーカー内では発生しません。

worker.disconnect()

[履歴]

バージョン変更点
v7.3.0このメソッドは worker への参照を返すようになりました。
v0.7.7追加: v0.7.7

ワーカー内では、この関数はすべてのサーバーを閉じ、それらのサーバーでの 'close' イベントを待ち、その後 IPC チャネルを切断します。

プライマリでは、ワーカーに内部メッセージが送信され、それ自身で .disconnect() を呼び出すようにします。

.exitedAfterDisconnect を設定する原因となります。

サーバーが閉じられた後、新しい接続は受け入れられなくなりますが、他のリッスン中のワーカーによって接続が受け入れられる可能性があります。既存の接続は通常どおりに閉じることができます。接続がなくなったとき、server.close() を参照してください。ワーカーへの IPC チャネルが閉じられ、正常に終了できます。

上記は サーバー 接続に のみ 適用されます。クライアント接続はワーカーによって自動的に閉じられることはなく、disconnect は終了前にそれらが閉じるのを待ちません。

ワーカー内では、process.disconnect が存在しますが、これはこの関数ではありません。これは disconnect() です。

長寿命のサーバー接続がワーカーの切断を妨げる可能性があるため、メッセージを送信して、アプリケーション固有のアクションを実行してそれらを閉じることができるようにすると役立つ場合があります。また、'disconnect' イベントが一定時間後に発生しなかった場合にワーカーを強制終了するタイムアウトを実装することも役立つ場合があります。

js
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
    }
  });
}

worker.exitedAfterDisconnect

Added in: v6.0.0

このプロパティは、workerが.disconnect()によって終了した場合にtrueになります。workerが他の方法で終了した場合はfalseです。workerが終了していない場合はundefinedです。

ブール値のworker.exitedAfterDisconnectを使用すると、自発的な終了と偶発的な終了を区別できるため、プライマリはこの値に基づいてworkerを再生成しないことを選択できます。

js
cluster.on('exit', (worker, code, signal) => {
  if (worker.exitedAfterDisconnect === true) {
    console.log('あら、それは自発的なものでした - 心配する必要はありません');
  }
});

// workerをkillする
worker.kill();

worker.id

Added in: v0.8.0

新しいworkerにはそれぞれ一意のidが与えられ、このidはidに格納されます。

workerが生きている間、これはcluster.workersでworkerをインデックス化するキーです。

worker.isConnected()

Added in: v0.11.14

この関数は、workerがIPCチャネルを介してプライマリに接続されている場合はtrue、そうでない場合はfalseを返します。workerは作成されるとプライマリに接続されます。'disconnect'イベントが発生すると、切断されます。

worker.isDead()

Added in: v0.11.14

この関数は、workerのプロセスが終了した場合(終了またはシグナルによる)はtrueを返します。それ以外の場合は、falseを返します。

js
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);
}
js
const cluster = require('node:cluster');
const http = require('node:http');
const numCPUs = require('node:os').availableParallelism();
const process = require('node:process');

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> ワーカープロセスに送信するkillシグナルの名前。デフォルト: 'SIGTERM'

この関数はワーカーをkillします。プライマリワーカーでは、worker.processを切断し、切断後にsignalでkillします。ワーカーでは、signalでプロセスをkillします。

kill()関数は、正常な切断を待たずにワーカープロセスをkillします。これはworker.process.kill()と同じ動作です。

このメソッドは、後方互換性のためにworker.destroy()としてエイリアスされています。

ワーカーでは、process.kill()は存在しますが、この関数ではありません。これはkill()です。

worker.process

追加: v0.7.0

すべてのワーカーはchild_process.fork()を使用して作成され、この関数から返されるオブジェクトは.processとして保存されます。ワーカーでは、グローバルなprocessが保存されます。

参照: 子プロセスモジュール

ワーカーは、'disconnect'イベントがprocessで発生し、.exitedAfterDisconnecttrueでない場合、process.exit(0)を呼び出します。これは偶発的な切断を防ぎます。

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

[履歴]

バージョン変更
v4.0.0callbackパラメータがサポートされました。
v0.7.0追加: v0.7.0
  • message <Object>

  • sendHandle <Handle>

  • options <Object> options引数(存在する場合)は、特定の種類のハンドルを送信するためのパラメータを設定するために使用されるオブジェクトです。optionsは次のプロパティをサポートします。

    • keepOpen <boolean> net.Socketのインスタンスを渡すときに使用できる値。trueの場合、ソケットは送信プロセスで開いたままになります。デフォルト: false
  • callback <Function>

  • 戻り値: <boolean>

ワーカーまたはプライマリに、オプションでハンドルを付けてメッセージを送信します。

プライマリでは、これは特定のワーカーにメッセージを送信します。これはChildProcess.send()と同じです。

ワーカーでは、これはプライマリにメッセージを送信します。これはprocess.send()と同じです。

この例では、プライマリからのすべてのメッセージをエコーバックします。

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

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

Event: 'disconnect'

Added in: v0.7.9

worker IPCチャネルが切断された後に発生します。これは、workerが正常に終了した場合、強制終了された場合、または手動で切断された場合(worker.disconnect()など)に発生する可能性があります。

'disconnect'イベントと'exit'イベントの間には遅延がある場合があります。これらのイベントを使用すると、プロセスがクリーンアップでスタックしているかどうか、または存続期間の長い接続があるかどうかを検出できます。

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

Event: 'exit'

Added in: v0.7.9

  • worker <cluster.Worker>
  • code <number> 正常に終了した場合の終了コード。
  • signal <string> プロセスが強制終了された原因となったシグナルの名前(例:'SIGHUP')。

いずれかのworkerが停止すると、clusterモジュールは'exit'イベントを発行します。

これは、.fork()を再度呼び出してworkerを再起動するために使用できます。

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

child_process event: 'exit'を参照してください。

Event: 'fork'

Added in: v0.7.0

新しいworkerがフォークされると、clusterモジュールは'fork'イベントを発行します。これは、workerのアクティビティをログに記録したり、カスタムタイムアウトを作成したりするために使用できます。

js
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();
});

Event: 'listening'

Added in: v0.7.0

ワーカーから listen() を呼び出した後、サーバーで 'listening' イベントが発生すると、プライマリの cluster でも 'listening' イベントが発生します。

イベントハンドラーは、2つの引数(ワーカーオブジェクトを含む worker と、次の接続プロパティを含む address オブジェクト: addressportaddressType)で実行されます。これは、ワーカーが複数のアドレスでリッスンしている場合に非常に役立ちます。

js
cluster.on('listening', (worker, address) => {
  console.log(
    `ワーカーが ${address.address}:${address.port} に接続されました`);
});

addressType は次のいずれかです。

  • 4 (TCPv4)
  • 6 (TCPv6)
  • -1 (Unix ドメインソケット)
  • 'udp4' または 'udp6' (UDPv4 または UDPv6)

Event: 'message'

[履歴]

バージョン変更点
v6.0.0worker パラメータが渡されるようになりました。詳細については下記を参照してください。
v2.5.0Added in: v2.5.0

クラスタプライマリが任意のワーカーからメッセージを受信したときに発生します。

child_process event: 'message' を参照してください。

Event: 'online'

Added in: v0.7.0

新しいワーカーをフォークした後、ワーカーはオンラインメッセージで応答する必要があります。プライマリがオンラインメッセージを受信すると、このイベントが発生します。 'fork''online' の違いは、fork はプライマリがワーカーをフォークしたときに発生し、'online' はワーカーが実行されているときに発生することです。

js
cluster.on('online', (worker) => {
  console.log('やった、ワーカーがフォーク後に応答しました');
});

イベント: 'setup'

追加: v0.7.1

.setupPrimary() が呼び出されるたびに発生します。

settings オブジェクトは、.setupPrimary() が呼び出された時点の cluster.settings オブジェクトであり、単一のティックで .setupPrimary() への複数の呼び出しが行われる可能性があるため、参考情報としてのみ利用してください。

精度が重要な場合は、cluster.settings を使用してください。

cluster.disconnect([callback])

追加: v0.7.7

  • callback <Function> すべてのワーカーが切断され、ハンドルが閉じられたときに呼び出されます。

cluster.workers 内の各ワーカーで .disconnect() を呼び出します。

それらが切断されると、すべての内部ハンドルが閉じられ、他のイベントが待機していない場合、プライマリプロセスが正常に終了できます。

このメソッドは、終了時に呼び出されるオプションのコールバック引数を受け取ります。

これは、プライマリプロセスからのみ呼び出すことができます。

cluster.fork([env])

追加: v0.6.0

新しいワーカープロセスを生成します。

これは、プライマリプロセスからのみ呼び出すことができます。

cluster.isMaster

追加: v0.8.1

非推奨: v16.0.0 以降

[Stable: 0 - Deprecated]

Stable: 0 Stability: 0 - 非推奨

cluster.isPrimary の非推奨のエイリアス。

cluster.isPrimary

追加: v16.0.0

プロセスがプライマリである場合は true。 これは process.env.NODE_UNIQUE_ID によって決定されます。 process.env.NODE_UNIQUE_ID が未定義の場合、isPrimarytrue です。

cluster.isWorker

追加: v0.6.0

プロセスがプライマリでない場合にtrueになります(cluster.isPrimary の否定です)。

cluster.schedulingPolicy

追加: v0.11.2

スケジューリングポリシー。ラウンドロビンの場合は cluster.SCHED_RR、オペレーティングシステムに任せる場合は cluster.SCHED_NONE です。これはグローバルな設定であり、最初にワーカーが生成された時点、または setupPrimary() が呼び出された時点のいずれか早い方で事実上固定されます。

SCHED_RR は、Windowsを除くすべてのオペレーティングシステムでデフォルトです。Windowsは、libuvが大きなパフォーマンスの低下なしにIOCPハンドルを効果的に分散できるようになった時点で、SCHED_RR に変更されます。

cluster.schedulingPolicy は、NODE_CLUSTER_SCHED_POLICY 環境変数を介して設定することもできます。有効な値は 'rr''none' です。

cluster.settings

[履歴]

バージョン変更点
v13.2.0, v12.16.0serialization オプションがサポートされるようになりました。
v9.5.0cwd オプションがサポートされるようになりました。
v9.4.0windowsHide オプションがサポートされるようになりました。
v8.2.0inspectPort オプションがサポートされるようになりました。
v6.4.0stdio オプションがサポートされるようになりました。
v0.7.1追加: v0.7.1
  • <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> 出力を親のstdioに送信するかどうか。デフォルト: false
    • stdio <Array> フォークされたプロセスのstdioを設定します。clusterモジュールはIPCに依存して機能するため、この構成には 'ipc' エントリが含まれている必要があります。このオプションを指定すると、silent がオーバーライドされます。child_process.spawn()stdio を参照してください。
    • uid <number> プロセスのユーザーIDを設定します。( setuid(2) を参照してください。)
    • gid <number> プロセスのグループIDを設定します。( setgid(2) を参照してください。)
    • inspectPort <number> | <Function> ワーカーのインスペクターポートを設定します。これは数値、または引数を取らずに数値を返す関数です。デフォルトでは、各ワーカーは独自のポートを取得し、プライマリの process.debugPort からインクリメントされます。
    • windowsHide <boolean> Windowsシステムで通常作成されるフォークされたプロセスのコンソールウィンドウを非表示にします。デフォルト: false

.setupPrimary() (または .fork()) を呼び出した後、この設定オブジェクトには、デフォルト値を含む設定が含まれます。

このオブジェクトは、手動で変更または設定することを意図していません。

cluster.setupMaster([settings])

[履歴]

バージョン変更
v16.0.0Deprecated since: v16.0.0
v6.4.0stdio オプションがサポートされるようになりました。
v0.7.1Added in: v0.7.1

[安定版: 0 - 非推奨]

安定版: 0 安定版: 0 - 非推奨

.setupPrimary() の非推奨エイリアス。

cluster.setupPrimary([settings])

追加: v16.0.0

setupPrimary はデフォルトの 'fork' の振る舞いを変更するために使用されます。一度呼び出されると、設定は cluster.settings に存在します。

設定の変更は、.fork() の将来の呼び出しにのみ影響し、すでに実行中のワーカーには影響しません。

.setupPrimary() で設定できないワーカーの唯一の属性は、.fork() に渡される env です。

上記のデフォルトは最初の呼び出しにのみ適用されます。後続の呼び出しのデフォルトは、cluster.setupPrimary() が呼び出された時点での現在の値です。

js
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
js
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

現在のワーカーオブジェクトへの参照。プライマリプロセスでは使用できません。

js
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}`);
}
js
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

アクティブなワーカーオブジェクトを id フィールドをキーとして格納するハッシュです。これにより、すべてのワーカーを簡単にループ処理できます。プライマリプロセスでのみ利用可能です。

ワーカーは、ワーカーが切断および終了した後に cluster.workers から削除されます。これらの2つのイベント間の順序は事前に決定できません。ただし、cluster.workers リストからの削除は、最後の 'disconnect' または 'exit' イベントが発行される前に行われることが保証されています。

js
import cluster from 'node:cluster';

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

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