Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Node.js 使用PM2时,我们如何配置主流程_Node.js_Ipc_Pm2 - Fatal编程技术网

Node.js 使用PM2时,我们如何配置主流程

Node.js 使用PM2时,我们如何配置主流程,node.js,ipc,pm2,Node.js,Ipc,Pm2,我对NodeJS中的PM2有问题。 在没有PM2的情况下,我们总是会有下面这样的代码行来配置主进程 if(cluster.isMaster){ //master process configuration } else { //worker process configuration } 确切地说,我想将一条消息从一个工作者发送到主机,然后,主机将向所有工作者发送一条消息,以通知一个事件 实际上,我看到,当使用PM2时,主进程配置中没有代码行运行 非常感谢您对这个问题的任何想法

我对NodeJS中的PM2有问题。 在没有PM2的情况下,我们总是会有下面这样的代码行来配置主进程

if(cluster.isMaster){
    //master process configuration
} else {
    //worker process configuration
}
确切地说,我想将一条消息从一个工作者发送到主机,然后,主机将向所有工作者发送一条消息,以通知一个事件

实际上,我看到,当使用PM2时,主进程配置中没有代码行运行


非常感谢您对这个问题的任何想法

对于PM2,通常不必使用这种结构。通常,它看起来如下所示:

var cluster = require('cluster');  
var http    = require('http');  
var os      = require('os');
var numCPUs = os.cpus().length;

if(cluster.isMaster){
  for (var i = 0; i < numCPUs; ++i) {
    cluster.fork();
  }
} else {
  http.createServer(function(req, res) {
    res.writeHead(200);
    res.end("hello world");
  }).listen(8080);
}
argv = process.argv.slice(2) //stripe 'node', 'app.js' away

if (argv[0] === 'master'){
   // ...
} else {
  // ...
}
pm2启动app.js-i

关于这个话题,你可以多读一些

更新:您可以通过传递命令行参数来区分主控和从控。 下面是一个示例ecosystem.json:

{
  "apps" : [
    {
      "name": "Master",
      "script": "app.js",
      "args": ["master"],
      "instances": "1",
    },
    {
      "name": "Slave",
      "script": "app.js",
      "args": ["slave"],
      "instances": "3"
    }
  ],
...
然后您可以执行以下操作:

var cluster = require('cluster');  
var http    = require('http');  
var os      = require('os');
var numCPUs = os.cpus().length;

if(cluster.isMaster){
  for (var i = 0; i < numCPUs; ++i) {
    cluster.fork();
  }
} else {
  http.createServer(function(req, res) {
    res.writeHead(200);
    res.end("hello world");
  }).listen(8080);
}
argv = process.argv.slice(2) //stripe 'node', 'app.js' away

if (argv[0] === 'master'){
   // ...
} else {
  // ...
}
PM2在内部使用“集群”创建子进程,然后自己充当主进程,不向外部提供任何功能。您仍然可以使用以下代码创建进程,但cluster.isMaster始终为false

if(cluster.isMaster){
  ...
  cluster.fork();
  ...
} else {
  ...
}
除非你这样开始:
pm2 start-x app.js

PM2的设计很好,但给初学者带来困惑。我们尽一切努力查看文档和谷歌搜索,但很难找到关于设计的任何解释。

如果您使用的是PM2>2.5(即2017年6月之后),您可以使用env变量:

if(process.env.NODE\u APP\u实例==“0”){
//这里的代码将只在集群中的第一个实例上执行
}
//这里的代码将在所有实例上执行

此变量仅在群集模式下可用。对于添加的每个新实例,它从零开始计数。我不知道为什么它是一个字符串而不是一个整数。

PM2只是有助于自动fork worker,但您不能实现类似于:worker.on('message',messageHandler)的东西,以处理从worker接收到的消息:(您可以生成“master”吗单独?这很尴尬,但在ecosystem.json中为master添加单独的条目会起作用。PM2允许为实例指定env变量,这可以帮助您区分master和slave。