pm2 进程间通信

pm2 进程间通信

本文将介绍 pm2 进程间如何通信

pm2-master.js,发送数据,可以在 pm2 内部或者外部运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
const pm2 = require('pm2');
const neighborIds = [];

pm2.connect(function () {
// 列出正在运行的进程并获取它们的名称/ID
pm2.list(function (err, processes) {
for (const i in processes) {
console.log('Id:', processes[i].pm_id, 'Name:', processes[i].name);

if (processes[i].name === 'pm2-slave') {
neighborIds.push(processes[i].pm_id);
}
}

console.log('neighborIds: ', neighborIds);

// 将信息发送到指定进程
pm2.sendDataToProcessId(
neighborIds[0],
{
type: 'process:msg',
data: {
some: 'data',
},
topic: true,
},
function (err, res) {
console.log('callback', err, res);
}
);
});
});

// 接收信息
pm2.launchBus(function (err, pm2_bus) {
pm2_bus.on('process:msg', function (packet) {
console.log('pm2-master launchBus', packet);
});
});

pm2-slave.js,接收数据,不需要引用 pm2 的包,但是一定要在 pm2 里运行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const sendMsgToMaster = () => {
process.send({
type: 'process:msg',
data: {
success: true,
num: Math.random(),
},
});
};

process.on('message', function (packet) {
console.log('got message from pm2-master', packet);
setTimeout(sendMsgToMaster, 2 * 1000);
});

ecosystem.config.js,pm2 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
module.exports = {
apps: [
// pm2-master 可以不用 pm2 运行
// {
// name: 'pm2-master',
// script: './pm2-master.js',
// instances: 1,
// watch: ['pm2-master.js'],
// merge_logs: true,
// exec_mode: 'cluster',
// max_memory_restart: '600M',
// instance_var: 'NODE_APP_INSTANCE'
// },
{
name: 'pm2-slave',
script: './pm2-slave.js',
watch: ['pm2-slave.js'],
exec_mode: 'cluster',
},
],
};

参考链接

作者

Sea

发布于

2021-07-20

更新于

2023-01-10

许可协议

评论