亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

nodejs中怎么實現兄弟進程通信

發布時間:2021-06-24 17:45:36 來源:億速云 閱讀:220 作者:Leah 欄目:大數據

今天就跟大家聊聊有關nodejs中怎么實現兄弟進程通信,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

問題

盡管我們可以在主進程中保存工作進程的實例,但是想通過主進程,完成工作進程和進程A的通信還是非常麻煩,步驟如下 

1 首先主進程要監聽每個工作進程發過來的任務 

2 然后把任務傳給進程A 

3 進程A處理完后,通知主進程,主進程再把結果發給對任務對應的子進程 其中,工作進程需要保存任務對應的上下文(比如說回調),因為工作進程可能同時給主進程發送了多個任務,當主進程通知工作進程某個任務完成的時候,工作進程需要通過任務找到對應的上下文,然后進行下一步處理,比如執行回調。

解決方案

在主進程中開啟一個服務,實現沒有繼承關系的子進程間通信,選取的進程間通信方式是unix域,沒有選tcp是因為同主機的進程間通信,使用tcp過于重和低效(需要經過協議棧的封包和解包)。子進程可以通過該服務和主進程通信,然后主進程轉發請求給處理cpu型任務的子進程。結構如下nodejs中怎么實現兄弟進程通信在主進程而不是進程A中開啟unix域服務是因為以后新增處理其他任務的子進程時,可以復用該unix域服務,起到api網關的作用。但是多了一層,會多了一些通信的成本。更直接的可以使用以下結構nodejs中怎么實現兄弟進程通信

具體實現

客戶端

const net = require('net');const { EventEmitter } = require('events');
class Work extends EventEmitter {}
class UnixDomainClient extends EventEmitter {  constructor(options) {    super();    this.options = options;  }  send(data) {    const work = new Work();    const socket = net.connect(this.options.path);    socket.end(JSON.stringify(data));    socket.on('error', (e) => {      work.emit('error', e);    });    let res = null;    socket.on('data', (chunk) => {      res = res ? Buffer.concat([res, chunk]) : chunk;    });    socket.on('end', () => {      work.emit('message', res && res.toString());    });    return work;  }}const work = new UnixDomainClient({path: '/tmp/test.sock'}).send('hello');work.on('message', function(res) {  console.log(res);})

服務器

const fs = require('fs');const net = require('net');const constants = {  UNIX_PATH: '/tmp/test.sock',}if (fs.existsSync(constants.UNIX_PATH)) {  fs.unlinkSync(constants.UNIX_PATH);}const server = net.createServer({ allowHalfOpen: true }, (client) => {  let data = null;  client.on('data', (chunk) => {    data = data ? Buffer.concat([data, chunk]) : chunk;  });  client.on('end', () => {    console.log(`recive msg: ${data.toString()}`)    client.end('world');  });});server.listen(constants.UNIX_PATH, () => {  console.log(`bind uinx path ${constants.UNIX_PATH}`);});server.on('error', (error) => {  console.log(`unix domain server error ${error.toString()}`);});process.on('exit', () => {  if (fs.existsSync(constants.UNIX_PATH)) {    fs.unlinkSync(constants.UNIX_PATH);  }});

看完上述內容,你們對nodejs中怎么實現兄弟進程通信有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

河北区| 玉田县| 云龙县| 海兴县| 苍溪县| 沿河| 丰镇市| 乌拉特前旗| 措美县| 元朗区| 宣威市| 呈贡县| 莒南县| 甘孜县| 阿瓦提县| 西藏| 桂平市| 安泽县| 阳信县| 陇西县| 徐州市| 通城县| 盐津县| 朔州市| 泰宁县| 隆安县| 乌恰县| 平顺县| 克山县| 镶黄旗| 梨树县| 新营市| 抚宁县| 疏附县| 区。| 衡南县| 灵川县| 嵊州市| 上犹县| 乌拉特后旗| 玉田县|