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

问题是:

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

  • example1.js中,有example2.js函数,其结果返回example1.js

  • example1.js内部可以调用example2.js并获取example1.js作为结果吗?

从我对Node.js的了解中,我仅找到一种使用套接字进行通信的解决方案。 但是,这不是理想的,因为它将需要一个进程在端口上侦听。 如果可能,我希望避免这种情况。


编辑:经过一些问题,我想补充一点,在层次结构example1.js不能是example2.js的子进程,而恰恰相反。 同样,如果有帮助,则只能有一个example1.js处理自己的数据,许多example2.js会处理自己的数据+来自第一个进程的数据。

Alexey Kamenskiy asked 2020-07-11T14:02:46Z
3个解决方案
46 votes

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

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

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

这是用于生成节点进程的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);
});
Linus Gustav Larsson Thiel answered 2020-07-11T14:03:23Z
6 votes

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

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

Kaicui answered 2020-07-11T14:03:47Z
6 votes

将Redis用作消息总线/代理。

[HTTPS://Redis.IO/topics/pub sub]

您还可以使用套接字消息传递(例如ZeroMQ)(点对点/对等),而不是使用消息代理(例如Redis)。

这是如何运作的?

使用Redis,在您的两个节点应用程序中,您都有两个进行发布/订阅的Redis客户端。 因此,每个node.js应用程序都将具有发布者和订阅者客户端(是的,每个节点进程需要2个客户端来进行Redis pub / sub)

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

Alexander Mills answered 2020-07-11T14:04:29Z
translate from https://stackoverflow.com:/questions/10213501/communicating-between-two-different-processes-in-node-js