nodejs使用cluster.setupMaster,将对象作为argv发送

时间:2013-06-01 16:00:00

标签: node.js cluster-computing

我刚刚参加了NodeJS,我正在阅读利用所有CPU的核心并在所有可用资源中产生这个过程。

这似乎是一个非常有趣的主题,我现在正在测试它。但我对群集设置中的argv对象键有疑问。

我正在使用此脚本启动服务器:

var path = require("path"),
    colors = require("colors");

var cluster = require('cluster'),
    os = require('os'),
    cores = os.cpus();

/*

var config = require(path.join(__dirname, 'config.json'));

*/

/*
 * Start Server
*/

cluster.setupMaster({

    exec : path.join(__dirname, "application.js"),
    args : ["--environment", "dev"]
});

if (cluster.isMaster) {

    for (var i = cores.length - 1; i >= 0; i--) {

        cluster.fork();
    };

    cluster.on("fork", function(worker) {

        console.log("Worker : [ %d ][ Status : Forking ]".cyan, worker.process.pid);
    });

    cluster.on("online", function(worker) {

        console.log("Worker : [ %d ][ Status : Online ]".green, worker.process.pid);
    });

    cluster.on("listening", function(worker, address) {

        console.log("Worker : [ %d ][ Status : Listening ][ Address : %s ][ Port : %d ]".yellow, worker.process.pid, address.address, address.port);
    });

    cluster.on("disconnect", function(worker) {

        console.log("Worker : [ %d ][ Status : Disconnected ]".white, worker.process.pid);
    });


    /*
     * Restart Dead Workers
    */

    cluster.on("exit", function(worker, code, signal) {

        console.log("Worker : [ %d ][ Status : Exit ][ Signal : %s ][ Code : %s ]".red, worker.process.pid, signal, code);

        cluster.fork();
    });

} else {

};

以上是我的server.js,正如exec中所述,它在运行时从应用程序开始:

var express = require("express"),
    http = require('http'),
    path = require("path"),
    optimist = require("optimist"),
    colors = require("colors"),
    recess = require("recess");

var application = module.exports = express(),
    config = optimist.argv;

console.log(config);

var routes = require(path.join(__dirname, "routes")),
    api = require(path.join(__dirname, "routes", "api"));

application.set('view engine', 'jade');
application.set('views', path.join(__dirname, 'views'));

application.configure(function(){

    application.use(express.bodyParser());
    application.use(express.methodOverride());

    application.use("/assets", express.static(path.join(__dirname, "public")));

    application.use(express.logger('dev'));

    application.use(application.router);
});

application.configure('development', function(){

    application.use(express.errorHandler({

        dumpExceptions: true,
        showStack: true
    }));
});

application.configure('production', function(){

    application.use(express.errorHandler());
});


/*
 * JSON API
*/

application.get('/api/test', api.test);


/*
 * Routing
*/

application.get('/', routes.index);
application.get('/partials/:name', routes.partials);

application.get('*', routes.index);

/*
 * Start Server
*/

var server = http.createServer(application).listen(process.env.PORT);

首先,我可以使用argv将对象作为选项发送到application.js脚本吗?如果是这样的话?如果不是,我想我现在只能发送简单的选项。

其次,最后,我正在使用语法吗?是否有必要在if(cluster.isMaster) {} else {}中添加其他内容(如果else中有任何需要,我最感兴趣的话)?我很抱歉,如果这个问题看起来有点愚蠢,但我几天前刚刚开始,我非常渴望了解更多有关Node的信息:))

1 个答案:

答案 0 :(得分:1)

有两种方法可以将对象发送给孩子:

  1. 通过将对象序列化为JSON字符串并传递给argv(只接受字符串参数)并在工作程序中反序列化,
  2. 在Master上收听工作人员的online事件,然后使用cluster.worker[<id>].send(<object>)发送一个对象,该对象将自动处理(反)序列化。
  3. 你掌握好看。关于我可以建议的唯一改进是将您的工作人员包裹在domain中,以便更好地处理错误。