Node.js 中子进程之间的通信

2023-12-14

我正在尝试在 node.js 中创建一个程序,使用以下命令创建两个进程fork()的方法childproccess。流程如下:

  • 父亲.js
  • Son1.js
  • Son2.js

我想直接在两个子进程之间传输数据,而不是在父进程和子进程之间传输数据。我向您展示了我正在尝试做的事情的图表。

子进程之间的通信

我尝试使用以下代码,但它对我不起作用。

In the 父亲.js代码中,我创建子进程如下:

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});

The Son1.js's code:

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"); 
});

And the 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.js to son2.js反之亦然,无需发送消息至father.js?


您可以执行以下操作:

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

父.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);

孩子.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);
    }
});

Output:

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

结果是两个子进程之间建立了直接的双向通信通道,由父进程进行存在调节。请记住,您必须以某种方式清理套接字文件(例如,在启动时或关闭父级之前删除它)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node.js 中子进程之间的通信 的相关文章

  • Nodemailer发送日历事件并将其添加到谷歌日历

    我正在尝试使用 nodemailer 将日历事件发送到 Gmail 帐户 这是我的代码 let transporter nodemailer createTransport host smtp gmail com port 587 secu
  • Node 不断恢复到旧版本

    每次我在控制台中重新启动 vagrant 时 它都会询问我的登录详细信息 然后说Now using node v7 10 0 npm v4 2 0 当我做run nvm install node I get v13 11 0 is alre
  • 函数不会等到 Promise 得到解决

    我正在开发一个简单的不和谐机器人 我正在尝试打印有关某个玩家的一些一般数据 我最近了解了 async await 并尝试将其实现到我的代码中 然而 它似乎不起作用 因为当我第一次触发此代码时 它会打印 null 但在后续触发时 它将打印正确
  • 在 Nodejs 中,如何停止 FOR 循环直到 MongoDB 调用返回

    我正在研究下面的代码片段 我有一个名为 stuObjList 的 JSON 对象数组 我想循环遍历数组以查找具有特定标志集的特定 JSON 对象 然后进行数据库调用以检索更多数据 当然 FOR 循环不会等待数据库调用返回并到达 j leng
  • 解释这段代码的工作原理;子进程如何返回值以及在哪里返回值?

    我不明白子进程如何返回该值以及返回给谁 输出为 6 7 问题来源 http www cs utexas edu mwalfish classes s11 cs372h hw sol1 html http www cs utexas edu
  • Docker - SequelizeConnectionRefusedError:连接 ECONNREFUSED 127.0.0.1:3306

    我正在尝试使用 Docker 容器启动并运行我的 Nodejs 应用程序 我不知道可能出了什么问题 当我使用控制台调试凭据时 凭据似乎已正确传递 另外启动sequel pro并使用相同的用户名和密码直接连接似乎也可行 当节点在容器中启动时
  • npm install -g expo-cli 失败并显示“EPERM:不允许操作,取消链接 '...\adb.exe'

    我在运行时收到错误 npm install g expo cli 我尝试以管理员身份重新安装节点模块 但出现相同的错误 环境 Windows 10 节点版本 10 15 3 NPM版本 6 9 0 我预计安装会发生 但出现了这样的错误 np
  • MongoDB中如何通过引用字段进行查询?

    我有两个 Mongo 模式 User id ObjectId name String country ObjectId Reference to schema Country Country id ObjectId name String
  • 最小验证在 Mongoose 中不起作用

    我有一个架构 其中余额字段的声明如下所示 balance type Number min 0 default 30 我将 0 设置为最小值 这样余额就不会为负值 但是当我通过更新查询减少余额值时 余额结果是负值 我的更新查询 User up
  • 无法连接到 Node.js 上的 MySQL 数据库

    我仍然不明白为什么在尝试连接到 Node js 上的 MYSQL Server 时仍然收到此错误消息 ERROR Error ER ACCESS DENIED ERROR Access denied for user root localh
  • Nodemailer - 在本地工作但不在生产环境中工作

    https gist github com anonymous ba82f74071cc38a0700b https gist github com anonymous ba82f74071cc38a0700b 在更改某些设置之前 例如主机
  • 如何阻止 Node.js 服务器崩溃

    我是节点js新手 我试图创建一个简单的 HTTP 服务器 我按照著名的例子创建了一个 Hello World 服务器如下 var handleRequest function req res res writeHead 200 res1 e
  • 从 websocket 发送数据到 socket.io

    我使用 websocket 接口连接到 websocket 服务器 如果我想将通过 websocket 接口从 websocket 服务器接收到的数据发送到通过 http 服务器连接到我的客户端 我应该使用 socket io 吗 所以最后
  • 渲染ejs模板

    我在nodejs中有以下代码 我读取temp ejs文件并获取ejsHtml作为字符串的内容 var html EJS render ejsHtml A div smth div 在 temp ejs 中 Output
  • 下载 csv 文件 node.js

    我正在使用 node js 构建一个应用程序并尝试将数据下载为 csv 文件 我正在使用 json2csv https www npmjs com package json2csv https www npmjs com package j
  • 如何使用C#与Chrome(Chrome扩展)通信?

    我想创建一个可以在我的 C 应用程序和扩展之间进行通信的桥梁 这是我真正想要的解释 我创建了一个扩展 它将获取 HTML 元素的详细信息 但每次启动 Chrome 时都会启动 除了这样做之外 有什么方法可以向我的 chrome 扩展发送消息
  • Nodejs 中的子域

    如何处理nodejs的子域请求 例如以下代码回显test在控制台中的任何请求http localhost 9876 任何内容 http localhost 9876 5Banything 5D var http require http h
  • 监听文件夹和文件(更改)

    可以直接在 PHP 或 Node 上监听文件夹和文件的更改 通过事件 还是我需要创建自己的方法来执行此操作 Example 我需要听文件夹 user 如果我将一些文件添加到该目录中 PHP 或 Node 会收到信息并运行PathEvent
  • 尝试安装 LESS 时出现“请尝试以 root/管理员身份再次运行此命令”错误

    我正在尝试在我的计算机上安装 LESS 并且已经安装了节点 但是 当我输入 node install g less 时 出现以下错误 并且不知道该怎么办 FPaulMAC bin paul npm install g less npm ER
  • 使用socket.io进行用户身份验证

    我已经红色了这个教程 http howtonode org socket io auth http howtonode org socket io auth 它展示了如何使用express和socket io对用户进行身份验证 但是有没有一

随机推荐

  • 使用 WCF 中的架构进行消息验证

    我想要的是用很少的属性 例如最小 最大 字符串长度等 来装饰我的数据契约 并获取为我的 SOAP 非 net 客户端生成的 XML 模式 经过在互联网上的一些研究 我发现了以下文章 http wcfsecurity codeplex com
  • 如何将nodeJS项目托管到firebase?

    我正在为该项目使用 Node Express 和更多其他依赖项 我想知道如何在 firebase 上托管这个项目 我的项目将有控制器 视图和任何其他文件夹以使项目成为可能 它已经有像 pug handlebars 这样的视图引擎 在线教程仅
  • C++ 中具有向量属性的 MPI 发送结构

    我想发送一个具有向量属性的结构 typedef struct int id vector
  • ggplot2 代码运行并更新绘图,但实际上没有显示数据

    我正在尝试使用生成图表ggplot2虽然我能够生成我想要使用的图表plot 当我运行下面的 ggplot 代码时 它会显示正确的轴 但没有数据或比例 数据看起来像这样 data lt data frame area c alpha alph
  • 由于 PreviewMouseLeftButtonDown,数据网格内的按钮未被触发

    我正在开发 WPF 应用程序 根据要求 我想在数据网格中显示项目列表 每行还有一个 删除 按钮 使用这个按钮我们可以删除相应的项目 我还想要网格的拖放功能 即用户可以向上 向下移动行 我在用 PreviewMouseLeftButtonDo
  • Codeigniter,空白页,没有错误[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 public function newreg username this gt inpu
  • headless eclipse 的 config.ini 设置

    From 这个帖子 当我尝试执行无头 Eclipse 代码时出现此错误消息 java lang RuntimeException Could not find framework at org eclipse equinox launche
  • 是否有一种机制可以禁用插入表?

    我有一个表 它的存在纯粹是为了充当某些逻辑的数组 该表应该只有一行 否则我的逻辑将失败 是否有任何 DDL 命令可以禁用插入表 截至目前 我已经插入了逻辑所需的 一行 数据 现在计划创建一个插入后触发器来删除新输入的记录 二 但是我注意到有
  • 使用 Pyinstaller 编译 Gekko

    我想知道是否可能 或者是否有人有任何经验 用 pyinstaller 将 gekko 优化包编译成 exe 作为测试用例 我使用来自 gekko 优化网站的 HS 71 Benchmark 用例 https gekko readthedoc
  • 使用 ncdf4::ncvar_get 时如何指定维度顺序?

    继上一个问题之后 从 netCDF 更快地读取时间序列 我重新排列了我的 netCDF 文件以提供快速的时间序列读取 github上的脚本最终会被清理 简而言之 为了使阅读速度更快 我重新排列了尺寸lat lon time to time
  • jquery remove 从另一个元素中删除

    根据here jquery删除函数应该像这样工作 div remove selector 我正在尝试在这个例子中 HTML div class wrapper p class unwanted This should be removed
  • 从一个表中选择并插入到另外两个表中

    我是 SQL 初学者 对 Transact SQL 不太了解 我意识到这是一个新手问题 但我正在寻找一个简单的解决方案 我有一个包含一些列的表 locationCode CustomerCode 主表 ItemCode locationCo
  • 如何使用来自服务或广播接收器的意图?

    我需要能够在我的活动关闭时处理 捕获意图 所以我正在寻找服务或广播接收器 是否有可能 接收 服务本身的意图 我尝试搜索 但找不到任何有用的东西 对于 BroadcastReceiver 我不太确定它在 Activity 之外是如何工作的 这
  • iOS 6/7 中“没有重用表格单元格的索引路径”消息的含义是什么?

    自从开始使用 iOS 6 以及 iOS 7 编译我的应用程序以来 我开始看到此消息 我知道 UITableViews 管理单元格的方式在 iOS 6 中是不同的 但我不需要修改我的代码来让它继续工作 但我担心此消息可能会指出一些我尚未看到的
  • 如何更改 Lollipop 中的 DatePicker 日历视图背景颜色?

    我花了很多功夫来改变 Lollipop 的 DatePicker 的默认背景颜色 我不能简单地使用 Styleable attrs 来更改默认样式 正如另一篇文章中提到的post 我只能使用反射来找到视图 然后对其进行更改 e g if a
  • 访问另一个文件中的类属性

    我是蟒蛇新手 我有一个关于访问类中属性的问题 t1 py usr bin python import t2 class A flag False if name main t2 f print A flag t2 py usr bin py
  • 如何cat <>包含代码的文件?

    我想使用将代码打印到文件中cat lt
  • Angular 5 - 可观察的返回错误无法读取未定义的属性

    当我使用以下命令调用我的 Web 服务时 我开始在我的 Angular 服务中使用 Spring Rest 和 Angular 5 实现一个简单的分页http客户端获得所请求页面的正确响应 它在我的页面上正确显示数据 但控制台 Web 浏览
  • 按行随机连接数据帧

    如何按行随机合并 连接或连接 pandas 数据帧 假设我有四个像这样的数据框 有更多行 df1 pd DataFrame col1 1 1 1 1 col2 1 2 1 2 col3 1 3 1 3 df2 pd DataFrame co
  • Node.js 中子进程之间的通信

    我正在尝试在 node js 中创建一个程序 使用以下命令创建两个进程fork 的方法childproccess 流程如下 父亲 js Son1 js Son2 js 我想直接在两个子进程之间传输数据 而不是在父进程和子进程之间传输数据 我