当使用node.js集群时,如何在一个工作进程崩溃后访问该进程的环境变量?

4
我正在使用node.js集群模块创建工作进程。在分叉它时,我设置了每个工作进程环境中的自定义变量。
当一个工作进程死亡时,我需要读取该自定义变量,但是当一个工作进程死亡时,我无法再访问它的环境对象。
至此,我尝试过以下方法:
var cluster = require('cluster'),
    os = require('os');

if (cluster.isMaster) {

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

        console.log('worker ' + worker.process.pid + ' died');

        var x = {
            workerId: worker.process.env.workerId // This is undefined.
        };
        cluster.fork(x);
    });

    for (var i = 0; i < os.cpus().length; i++) {
        var x = {
            workerId: i
        };
        cluster.fork(x);
    }

}
else {
    console.log("workerId: ", process.env.workerId);

    // simulate an exeption:
    throw "fakeError";

}

我知道这样做行不通,我的问题是:如何在worker死亡之前访问其环境的最新状态?

你可以在集群代码中的一个对象中维护工作进程ID到工作ID的映射,这样当一个工作进程死亡时,你就可以获取相应进程ID的工作ID。 - Ankur
当一个进程停止时,它的环境也随之消失。也许你应该解释一下你想要做什么,可能有更好的方法。 - robertklep
2个回答

8

看起来env只在工作进程中设置,而且在主进程中无法访问。主进程只有关于工作进程的基本信息。您可以按照以下方式进行操作:

// Fork workers.
for (var i = 0; i < numCPUs; i++) {
    var env = {workerId: i},
        newWorker = cluster.fork(env);
    newWorker.process.env = env;
}

cluster.on('exit', function (worker, code, signal) {
    console.log('worker ', worker.process.env.workerId, ' died');
    var env = worker.process.env,
        newWorker = cluster.fork(env);
    newWorker.process.env = env;
});

我希望能够帮到您。

每当工人更改他们的环境时,他们应该向主节点发送消息,并通知它有关这些更改,以便主节点可以更新其信息。


今天尝试了一下,在cluster.on('exit')中,worker.process.env未定义。所以我没有将其视为从一个已停止的工作进程传递信息给接替它的工作进程的方法。或许在8年间有所改变。 - undefined

-1

您可以订阅集群的exit事件,当集群中的任何工作进程死亡时,您将收到通知。此时,您可以执行任何您想要的操作。

代码片段直接从文档中提取

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接