プログラム関係の備忘録。技術系記事1000記事以上を目指すブログ

cluster,express-clusterを使ったNode.jsのマルチスレッド化

  • 2020年7月10日
  • 2020年7月10日
  • node.js
  • 1190view
  • 1件

前提

express-generatorでのひな型をベースとし、bin/wwwファイルに追記する。
clusterとexpress-cluster2つの方法を記述します。

1.clusterを使ったNode.jsのマルチスレッド化

npm i cluster

bin/www

const cluster = require('cluster');
const numCpus = require('os').cpus().length;
const host = process.env.HOST || "127.0.0.1"
const port = process.env.PORT || 3001;

cluster.schedulingPolicy = cluster.SCHED_NONE; // windowsの場合

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

  for (let i = 0; i < numCpus; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} was killed by signal: ${signal}`);
    cluster.fork();
  });
} else {   
  var server = http.createServer(app);
  server.listen(port, host);
  server.on('error', onError);
  server.on('listening', onListening);
  console.log("Server running on http://" + host + ":" + port + `Worker ${process.pid} started`);
}


この状態でnpm startコマンドで以下のようにマシンのスレッド数分ワーカーが立ち上がる

参考
https://nodejspedia.com/ja/tutorial/2817

cluster.schedulingPolicyは環境変数でも指定可能

スケジューリングポリシー。
深くは理解していないがwindows用のデフォルト値とUnix系のデフォルト値があるのでその値を設定する。

しかし、開発環境はwindows、本番環境はUnixなどのときのため、環境変数でも指定ができるようです。

2.express-clusterを使ったNode.jsのマルチスレッド化

もう一つ、express-clusterを使う場合も一応残しておく

npm i express-cluster

bin/www

const cluster = require('express-cluster');

const host = process.env.HOST || "127.0.0.1"
const port = process.env.PORT || 3001;

cluster(worker => {
  server.listen(port, host, () => {
    console.log(
      "Server running on http://" + host + ":" + port + " with pid " + process.pid + " with wid " + worker.id
    );
  });
});

上記でも確認はできたが、前者のclusterモジュールを使うほうが一般的のよう。

あとがき

express-clusterとclusterが別モジュールというのに気づいておらず、clusterの「cluster.isMaster」が全く真偽を返さないのに疑問で少し時間を無駄にした。