中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

永和县| 侯马市| 三穗县| 普格县| 萨嘎县| 南京市| 天水市| 石渠县| 柳林县| 项城市| 南木林县| 平舆县| 泸定县| 富宁县| 深州市| 西乌珠穆沁旗| 新巴尔虎右旗| 清镇市| 万州区| 阿坝县| 牟定县| 荣昌县| 广德县| 邹城市| 百色市| 浦城县| 固阳县| 凤冈县| 泰安市| 太保市| 洞口县| 伊春市| 荔波县| 鸡东县| 娄底市| 土默特右旗| 噶尔县| 台北市| 大洼县| 泌阳县| 新蔡县|