Javascript 控制节点中的多个进程
好吧,所以我有一个机器人托管的事情我做。这几乎是我现在唯一能让我保持清醒的东西。这是一个用于音乐/聊天网站的IRC类型的机器人,它可以做很多事情。但问题是让他们保持在线。我曾经使用一个sh文件来单独启动所有机器人 等等,等等,这起作用了。但是机器人本身需要大约30mb的内存,而永久进程也需要大约30mb的内存。所以当我运行这么多的机器人时,我的内存已经快用完了,这并不好,因为如果我不得不换一台服务器,事情对我来说会变得无限复杂,老实说,我在这方面不是很在行 所以我做了一些研究,认为我应该使用Javascript 控制节点中的多个进程,javascript,node.js,Javascript,Node.js,好吧,所以我有一个机器人托管的事情我做。这几乎是我现在唯一能让我保持清醒的东西。这是一个用于音乐/聊天网站的IRC类型的机器人,它可以做很多事情。但问题是让他们保持在线。我曾经使用一个sh文件来单独启动所有机器人 等等,等等,这起作用了。但是机器人本身需要大约30mb的内存,而永久进程也需要大约30mb的内存。所以当我运行这么多的机器人时,我的内存已经快用完了,这并不好,因为如果我不得不换一台服务器,事情对我来说会变得无限复杂,老实说,我在这方面不是很在行 所以我做了一些研究,认为我应该使用ch
child.fork()
,然后使用一个bot.js来生成其余的bot。它工作得很好,并且把我的内存使用量减少到原来的一半以下。但是现在让机器人在线是件痛苦的事
var child = require("child_process");
var running = {};
var bots = ["bot1","bot2","bot3"];
for (var i=0;i<bots.length;i++) {
running[bots[i]] = child.fork("bots/"+bots[i]+".js");
};
var child=require(“child_进程”);
var running={};
变量bots=[“bot1”、“bot2”、“bot3”];
对于(var i=0;i请查看substack。单个机队无人机可以管理任意数量的进程,并将自动重新启动任何崩溃的进程
Fleet通过设置一个中心和一个或多个连接到中心的无人机来工作。您可以使用git将代码推送到中心。中心会自动将新版本的代码部署到所有连接的无人机上。然后您可以调用Fleet spawn--node foo.js
。Fleet将开始运行node foo.js
,并自动重新启动foo.js如果崩溃我的解决方案是在节点内使用进程spawn
,使用Promise
模式同步进程执行,然后将结果与Promise.all连接起来(请参见函数promiseAll
此处:
var promiseAll = function(items, block, done, fail) {
var self = this;
var promises = [],
index = 0;
items.forEach(function(item) {
promises.push(function(item, i) {
return new Promise(function(resolve, reject) {
if (block) {
block.apply(this, [item, index, resolve, reject]);
}
});
}(item, ++index))
});
Promise.all(promises).then(function AcceptHandler(results) {
if (done) done(results);
}, function ErrorHandler(error) {
if (fail) fail(error);
});
}; //promiseAll
现在做导入
var cp = require('child_process');
并写入将生成每个进程的执行块:
var ExecutionBlock = function(item, index, resolve, reject) {
var options = [
"--ssl-protocol", "tlsv1",
"--ignore-ssl-errors", "true"
];
options.push(executableFile); // push input file path
options.push(item); // push executable arguments
// LP: now spawn the power!
var child = spawn(settings.executable, options);
// Listen for an exit event:
child.on('exit', function(exitCode) {
console.log("Child exited with code: " + exitCode);
return resolve(exitCode);
});
// Listen for stdout data
child.stdout.on('data', function(data) {
console.log(data.toString());
});
// child error
child.stderr.on('data',
function(data) {
console.log('err data: ' + data);
// on error, kill this child
child.kill();
return reject(new Error(data.toString()));
}
);
} //ExecutionBlock
此时,假设在inputItemsArray
中有可执行文件的参数列表,我们可以通过Promise运行它们。所有方法:
// inputItemsArray is a list of arguments for the executable
promiseAll(inputItemsArray, function(item, index, resolve, reject) {
ExecutionBlock(item, index, resolve, reject);
}
,function(results) { // aggregated results
// all execution done here. The process exitCodes will be returned
// array index is the index of the processed that exited
}
,function(error) { // error
});
完成块将在一个数组中聚合退出代码,因为我们已在解析
中返回它们。通过这种方式,您可以很好地控制执行,在执行期间为每个进程设置exitCode
,最终为每个进程设置stdout
和stderr
要点中的一个工作示例
// inputItemsArray is a list of arguments for the executable
promiseAll(inputItemsArray, function(item, index, resolve, reject) {
ExecutionBlock(item, index, resolve, reject);
}
,function(results) { // aggregated results
// all execution done here. The process exitCodes will be returned
// array index is the index of the processed that exited
}
,function(error) { // error
});