目次
前提
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」が全く真偽を返さないのに疑問で少し時間を無駄にした。