在Node.js中的两个不同进程之间进行通信

时间:2012-04-18 16:11:25

标签: node.js process

问题是:

  • 让我们假设我们有两个运行的Node.js进程:example1.jsexample2.js

  • example1.js中,有一个函数func1(input)作为结果返回result1

  • 是否可以从example2.js内拨打func1(input)并获取result1作为结果?

从我对Node.js的了解中,我发现了一个使用套接字进行通信的解决方案。这不太理想,因为它需要一个进程监听端口。如果可能的话,我希望避免这种情况。


编辑:在我提出一些问题后,我希望在层次结构example1.js中添加example2.js不能成为子进程,而是相反。如果它有帮助 - 只有一个example1.js处理自己的数据,许多example2.js处理自己的数据+来自第一个流程的数据。

2 个答案:

答案 0 :(得分:46)

您描述的用例让我想到dnode,使用它可以轻松地公开由不同进程调用的函数,由dnode协调,dnode使用网络套接字(和socket.io,因此您可以使用浏览器中的相同机制。)

另一种方法是使用消息队列,有many good bindings for different message queues

据我所知,最简单的方法是使用child_process.fork()

  

这是产生Node进程的spawn()功能的特例。除了在普通的ChildProcess实例中具有所有方法之外,返回的对象还具有内置的通信通道。该频道将使用child.send(message, [sendHandle])写入,并且该子频道上的'message'事件会收到消息。

因此,对于您的示例,您可以使用example2.js:

var fork = require('child_process').fork;
var example1 = fork(__dirname + '/example1.js');

example1.on('message', function(response) {
  console.log(response);
});

example1.send({func: 'input'});

并且example1.js:

function func(input) {
  process.send('Hello ' + input);
}

process.on('message', function(m) {
  func(m);
});

答案 1 :(得分:6)

可能你应该试试Messenger.js。它可以方便地进行IPC。

您不必自己在两个进程之间进行通信。