成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Nodejs每日一講之Nodejs的進程間通信

網絡 通信技術
linux系統提供了很多種進程間通信的方式,那么為什么nodejs選擇unix域的,因為unix域相比其他進程間通信方式,有一個獨特的優勢,那就是傳遞文件描述符。

[[376460]]

本文轉載自微信公眾號「編程雜技 」,作者theanarkh。轉載本文請聯系編程雜技 眾號。   

之前提了一個問題:nodejs中如何實現兄弟進程間的通信,大家分別列舉了redis、ZooKeeper,MessageChannel,還有linux操作系統提供的共享內存等一系列的進程間通信方式。所以今天來分享一下到底如何實現nodejs的進程間通信。這里的討論只限于linux系統,本機的進程。情況分為兩種:父子進程,兄弟進程。

在nodejs中,實現進程間通信的方式其實只有一種,那就是unix域。linux系統提供了很多種進程間通信的方式,那么為什么nodejs選擇unix域的,因為unix域相比其他進程間通信方式,有一個獨特的優勢,那就是傳遞文件描述符。unix域的實現是基于c/s模式的,類似tcp,udp。首先需要啟動一個unix域服務器,然后各個unix客戶端就可以"連接"這個服務器進行通信。

 

而在nodejs中父子進程的通信,底層使用的是socketpair,socketpair底層是也是unix域,不過他不是基于c/s模式的,如下圖所示。

 

那么nodejs中,兄弟進程是如何通信的呢?最簡單的方式就是通過主進程

 

但是這里多了一次中轉,很明顯效率上面會存著一些問題(相對直達和多一次中轉,性能比較是很明顯的,但是沒具體測過。而且據說egg就是這么搞的,有了解的同學可以交流一下)。所以我們一般通過unix域實現兄弟進程的通信,但是我們需要做的事情就比較多了。我們看看unix域的類型。Unix域支持兩種數據模式

1 流式( SOCK_STREAM),類似tcp,數據為字節流,需要應用層處理粘包問題。

 

2 數據報模式( SOCK_DGRAM ),類似udp,不需要處理數據邊界。

 

但是不巧的是Nodejs使用的是流式模式,所以問題就變得復雜。這時候我們通過c/s模式雖然可以實現兄弟進程間的通信,但是我們拿到的數據可能是"亂的",這時候為什么呢?一般情況下,客戶端給服務器發送1個字節,然后服務器處理,如果是基于這種場景,那么數據就不會是亂的。因為每次就是一個需要處理的數據單位。但是如果客戶端給服務器發送1個字節,服務器還沒來得及處理,客戶端又發送了一個字節,那么這時候服務器再處理的時候,就會有問題。因為兩個字節混一起了。就好比在一個tcp連接上先后發送兩個http請求一樣,如果服務器沒有辦法判斷兩個請求的數據邊界,那么處理就會有問題。

我們寫一個測試的例子。

unix域服務器

const net = require('net');net.createServer((client) => { client.on('data', (data) => { console.log(data.toString('utf-8')) })}).listen('\\\\?\\pipe\\ipc')

unix域客戶端

const net = require('net');const socket = net.connect({path: '\\\\?\\pipe\\ipc'});setInterval(() => { socket.write('1'); socket.write('2');},1000)

我們看一下輸出

 

我們看到輸出可能是1然后2。也可能是12。在tcp協議中,這叫做粘包。那么我們如何解決這個問題呢?我們可以定義一個應用層協議。類似http協議一樣,有了協議我們就知道,如何去解析收到的數據。接著我們還需要實現這個協議的解析器和封包邏輯,做完這些,我們就可以實現兄弟進程的通信了。

 

 

具體可參考ipc庫的實現https://github.com/theanarkh/nodejs-ipc

 

責任編輯:武曉燕 來源: 編程雜技
相關推薦

2020-11-04 07:17:42

Nodejs通信進程

2017-08-06 00:05:18

進程通信開發

2010-01-05 10:00:48

Linux進程間通信

2022-05-24 08:09:00

HadoopHiveSpark

2019-08-30 10:08:33

NodejsJava語言

2012-05-04 13:25:46

HTML5

2011-06-22 17:09:50

QT 進程 通信

2022-01-17 07:59:13

SpringSpringMVCSpringBoot

2018-05-30 13:58:02

Linux進程通信

2019-05-08 11:10:05

Linux進程語言

2022-10-11 15:18:41

NodeJSCookie

2018-01-12 14:35:00

Linux進程共享內存

2017-06-19 13:36:12

Linux進程消息隊列

2013-03-28 13:14:45

AIDL進程間通信Android使用AI

2019-11-27 10:36:11

進程通信IPC

2022-07-04 08:29:13

electron通信

2016-05-24 10:40:32

NodeJS總結

2017-08-07 20:18:11

Android線程handler

2019-11-08 14:47:49

TCPIP網絡

2020-09-10 09:05:29

UDP服務器Nodejs
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美精品一区二区在线观看 | 亚洲一区二区三区四区五区中文 | 激情久久久久 | 国产欧美日韩在线 | 琪琪午夜伦伦电影福利片 | 影音先锋久久 | 99精品久久 | 欧美精品99 | 国产精品一区二区在线 | 日韩一二区在线 | 亚洲人在线播放 | 国产成人精品一区二区三区视频 | 亚洲视频中文字幕 | 日本电影韩国电影免费观看 | 亚洲精品久久久一区二区三区 | 成人免费精品视频 | 国产精品久久亚洲7777 | 春色av| 欧美亚洲成人网 | 欧美精品一区在线 | 久久久久国产一区二区三区四区 | 亚洲精品久久嫩草网站秘色 | 国产精品日韩欧美一区二区 | 狠狠干美女 | 国产成人免费视频网站高清观看视频 | 天天干天天草 | 91国产在线视频在线 | 国产成人精品一区二区三区在线 | 九九久久国产 | 亚洲高清在线 | 国产精品美女久久久 | 日本福利视频 | 国产成人免费在线 | 久久亚洲精品国产精品紫薇 | 国产成人精品一区二区三区四区 | 欧美一区不卡 | 中文字幕av亚洲精品一部二部 | 日本亚洲欧美 | 一区二区福利视频 | 日韩免费高清视频 | 婷婷色国产偷v国产偷v小说 |