49

问题是:

  • 假设我们有两个 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人处理自己的数据+来自第一个进程的数据。

4

3 回答 3

50

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

另一种方法是使用消息队列,对于不同的消息队列有很多很好的绑定

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

spawn()这是生成节点进程的功能的一个特例。除了在普通 ChildProcess 实例中包含所有方法外,返回的对象还内置了一个通信通道。通道被写入 withchild.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);
});
于 2012-04-18T16:26:34.660 回答
6

也许您应该尝试Messenger.js。它可以方便地进行IPC。

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

于 2012-08-23T05:38:49.013 回答
6

使用 Redis 作为消息总线/代理。

https://redis.io/topics/pubsub

您还可以使用像 ZeroMQ 这样的套接字消息传递,它是点对点/对等的,而不是使用像 Redis 这样的消息代理。

这是如何运作的?

使用 Redis,在您的两个节点应用程序中,您都有两个 Redis 客户端执行发布/订阅。所以每个 node.js 应用程序都会有一个发布者和订阅者客户端(是的,对于 Redis 发布/订阅,每个节点进程需要 2 个客户端)

使用 ZeroMQ,您可以通过 IPC 通道直接在 node.js 进程之间发送消息(不涉及代理 - 可能除了操作系统本身......)。

于 2015-09-13T02:52:33.113 回答