Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 控制节点中的多个进程_Javascript_Node.js - Fatal编程技术网

Javascript 控制节点中的多个进程

Javascript 控制节点中的多个进程,javascript,node.js,Javascript,Node.js,好吧,所以我有一个机器人托管的事情我做。这几乎是我现在唯一能让我保持清醒的东西。这是一个用于音乐/聊天网站的IRC类型的机器人,它可以做很多事情。但问题是让他们保持在线。我曾经使用一个sh文件来单独启动所有机器人 等等,等等,这起作用了。但是机器人本身需要大约30mb的内存,而永久进程也需要大约30mb的内存。所以当我运行这么多的机器人时,我的内存已经快用完了,这并不好,因为如果我不得不换一台服务器,事情对我来说会变得无限复杂,老实说,我在这方面不是很在行 所以我做了一些研究,认为我应该使用ch

好吧,所以我有一个机器人托管的事情我做。这几乎是我现在唯一能让我保持清醒的东西。这是一个用于音乐/聊天网站的IRC类型的机器人,它可以做很多事情。但问题是让他们保持在线。我曾经使用一个sh文件来单独启动所有机器人

等等,等等,这起作用了。但是机器人本身需要大约30mb的内存,而永久进程也需要大约30mb的内存。所以当我运行这么多的机器人时,我的内存已经快用完了,这并不好,因为如果我不得不换一台服务器,事情对我来说会变得无限复杂,老实说,我在这方面不是很在行

所以我做了一些研究,认为我应该使用
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

});