gpt4 book ai didi

javascript - Node.js:集群中具有不同代码的工作人员?

转载 作者:IT老高 更新时间:2023-10-28 23:23:33 27 4
gpt4 key购买 nike

我在 node.js 中有一个应用程序。

此应用程序分为 3 个部分:

launcher.js,启动另外两个部分,并在处理完清理后在崩溃/更新时重新启动它们。

app.js,自己在电脑上工作。

server.js 用于访问日志和不同的命令。

启动器的简化代码为:

var cluster = require('cluster'),
exec = require('child_process').exec,
server;

if (cluster.isMaster) {
cluster.fork();
server = exec('server.js');

cluster.on('exit', function(worker, code, signal) {
//Clean corrupted data, log crash if neccessary, reload source code for update ...
cluster.fork();
});
server.on('exit', function () {
//Same as for app, with a different handling of signal...
server = exec('node server.js');
});
} else {
var self = require('app.js');
self.start();
}

集群的好处是它们与启动器在同一个进程中,因此我可以处理一些错误而无需重新启动应用程序(只需在应用程序内调用正确的函数以进行自身的“软重启”) ,并将所有内容保持在同一进程中。

使用 exec 时,我一直在重启服务器,有时不知道出了什么问题,这意味着有一个我不喜欢的子 shell。

有没有办法 fork 集群,但启动不同的代码?

最佳答案

我的解决方案:

var cluster = require("cluster");
if(cluster.isMaster){
// Forking Worker1 and Worker2
var worker1 = cluster.fork({WorkerName: "worker1"});
var worker2 = cluster.fork({WorkerName: "worker2"});

// Respawn if one of both exits
cluster.on("exit", function(worker, code, signal){
if(worker==worker1) worker1 = cluster.fork({WorkerName: "worker1"});
if(worker==worker2) worker2 = cluster.fork({WorkerName: "worker2"});
});
} else {
if(process.env.WorkerName=="worker1"){
// Code of Worker1
}

if(process.env.WorkerName=="worker2"){
// Code of Worker2
}
}

一个更动态的例子:

var cluster = require("cluster");

if(cluster.isMaster){

// Forking Workers based on args

if(process.argv.length < 3){
console.log("Usage: "+process.argv[1]+" module [module]");
}

process.argv.forEach(function (val, index, array) {
// Don't use this script as worker (index 1 = self)
if(index>1){
// Resolve the module before spawning to prevent loop.
try { require.resolve(val); spawn(val); }
catch(e) { console.error("Module '"+val+"' not found"); }
}
});

cluster.on("exit", function(worker, code, signal){
respawn(worker);
});
} else {
var self = require(process.env.WorkerScript);
self.start();
}


function spawn(script){
cluster.fork({WorkerScript: script}).env = {WorkerScript: script};
}

function respawn(worker){
console.log("Respawning: "+worker.env.WorkerScript)
cluster.fork(worker.env).env = worker.env;
}

关于javascript - Node.js:集群中具有不同代码的工作人员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20568825/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com