2

node.js の Express で構築された Rest API アプリでクラスタリングを使用しています。

クラスタリングを利用する REST API の完全なコードは次のとおりです。

var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
var counter = {"color":{},"weight":{}};

if (cluster.isMaster) {

        for (var i = 0; i < numCPUs; i++) {
            cluster.fork();
        }

        cluster.on('exit', function(worker, code, signal) {         
            var exitCode = worker.process.exitCode;
            console.log('worker ' + worker.process.pid + ' died ('+exitCode+'). restarting...');
            cluster.fork();     
        });



} else {    

        var express = require("express"),
        var msg;
        var server = express();     
        server.use(express.bodyParser());
        server.post('/grouper', function (req, res) {

            //some update on global counter         

        });

        server.listen(8080);

}

私の質問は、すべてのインスタンスが同じオブジェクトを更新するように、フォークされた異なるインスタンス間のコードに示されているカウンター オブジェクトのようなグローバル オブジェクトを持つ方法はありますか?

4

2 に答える 2

8

実際、すべてのワーカー プロセスは、独立してアプリケーション変数の新しいコピーです。

各ワーカーは、 で作成されたフル機能のプロセスですchild_process.fork。ドキュメントでは、次のステートメントを取得できます。

ワーカー間で共有状態はありません。ワーカーはすべて個別のプロセスであるため、他のワーカーに影響を与えることなく、プログラムのニーズに応じて強制終了または再生成できます。

したがって、答えはいいえ、変数を共有できませんcounter。クラスタープロセスは変数を共有しません。

于 2013-07-15T11:54:06.823 に答える
1

共有リソースの更新部分をマスターに移動することでこれを行いました

if (cluster.isMaster) {

        for (var i = 0; i < numCPUs; i++) {

            var worker = cluster.fork();

            worker.on('message', function(msg) {

                //update counter according to attributes in msg         
                console.log(counter);

            });


        }

        // some code



} else {    

        var express = require("express"),
        var msg;
        var server = express();     
        server.use(express.bodyParser());
        server.post('/grouper', function (req, res) {

            //some update on global counter  
            msg = req.body;
            //communicate to master here
            process.send(msg);       

        });

        server.listen(8080);

}

process.send子プロセスからマスターに通信し、更新部分をマスターに保持します。

于 2013-07-15T12:50:33.623 に答える