Node.js中的subprocess之间的通信

我想在node.js中创build一个使用childproccess的fork()方法创build两个进程的程序。 过程如下:

  • Father.js
  • Son1.js
  • Son2.js

我想直接在两个subprocess之间传输数据,而不是在父子之间传输数据。 我向你展示了我想要做的事情。

儿童进程之间的沟通

我试着用下面的代码,但它不适合我。

father.js代码中,我正在创buildsubprocess,如下所示:

 const cp = require("child_process"); var son1 = cp.fork("${__dirname}/son1.js"); var son2 = cp.fork("${__dirname}/son2.js"); console.log("father sending message to son1.."); son1.send({msg:'Hi son1',br:son2}); console.log("father sending message to son2.."); son2.send({msg:'Hi son1',br:son1}); 

Son1.js的代码:

 var brother=null; process.on('message', function(json) { console.log('message father in son1.js;', json.msg); brother=json.br; brother.send("hello I'm son1.js"); }); 

Son2.js的代码是:

 var brother=null; process.on('message', function(json) { console.log('message father in son2.js;', json.msg); brother=json.br; brother.send("hello I'm son2.js"); }); 

如何发送和接收从son1.jsson2.js消息,反之亦然,而不发送消息到father.js

您将不得不打开另一个通信通道,例如本地套接字(tcp,udp或unix)或第三方服务(例如redis)。

发送数据到subprocess可以使用这个

 const fork = require('child_process').fork('./son1.js') fork.send('message') son1.js process.on('message', message => { console.log(message) process.exit() }) 

以下是你可以做的事情:

  1. 在链接到套接字文件的父级上创build一个IPC服务器。
  2. 打开一个到服务器的连接(仍在父节点中),创build一个套接字对。
  3. 将服务器的套接字发送给一个孩子,将客户端的套接字发送给另一个孩子。

parent.js:

 const net = require('net'); const cp = require('child_process'); let u_proc_1 = cp.fork(__dirname+'/child.js', ['#1']); let u_proc_2 = cp.fork(__dirname+'/child.js', ['#2']); // create IPC server on parent let d_server = net.createServer((d_socket_2) => { // send server socket to #2 u_proc_2.send('socket', d_socket_2); }); // create socket file let p_socket = __dirname+'/sibling.sock'; // bind server to socket file d_server.listen(p_socket); // create client socket; this also triggers creation of a server socket let d_socket_1 = net.connect(p_socket, () => { // have #1 send to #2 u_proc_1.send('hey!'); // have #2 send to #1 u_proc_2.send('hello'); }); // send client socket to #1 u_proc_1.send('socket', d_socket_1); 

child.js:

 const name = process.argv[2]; let d_socket_sibling; process.on('message', (s_action, d_socket_msg) => { // parent is sending a socket if('socket' === s_action) { console.log(name+' now has a socket'); // save socket to variable for later use d_socket_sibling = d_socket_msg; // receive data from sibling d_socket_sibling.on('data', (s_data) => { console.log(name+' received: '+s_data); }); } // otherwise, parent wants me to send message to sibling else { console.log(name+' is sending: '+s_action); // send data to sibling d_socket_sibling.write(s_action); } }); 

输出:

 #2 now has a socket #1 now has a socket #2 is sending: hello #1 is sending: hey! #1 received: hello #2 received: hey! 

其结果是两个subprocess之间的直接,双向的沟通渠道,由父母存在介导。 请记住,您将不得不以某种方式清理套接字文件(例如,在启动时或closures父项之前删除它)

在这里输入图像说明

你可以查看这个post看到这个链接