Node 程序間怎麼通訊的

2022-01-18 11:19:01 字數 1949 閱讀 1280

我們都知道 node 沒法操作執行緒,但可以操作程序,一旦涉及主從模式的程序守護,或者是多機部署的需要,那麼都可能碰上需要相互通訊的場景,本篇就介紹幾種常用方法。

最自然的方式,比上一種「正規」一些,具有同樣的侷限性。其底層是 libuv。

// parent.js

const cp = require('child_process');

const n = cp.fork(`child.js`);

n.on('message', (m) => );

// 使子程序輸出: 子程序收到訊息

n.send();

// child.js

process.on('message', (m) => );

// 使父程序輸出: 父程序收到訊息

process.send();

執行

> node parent.js

子程序收到訊息

父程序收到訊息

libuv 的程序通訊能力是怎麼來的?

這就要涉及到作業系統的程序間通訊方式了,參見深刻理解linux程序間通訊(ipc)。程序間通訊一般通過共享記憶體的方式實現的,使得多個程序可以訪問同一塊記憶體空間,是最快的可用 ipc 形式。

最通用的方式,借助網路完成程序通訊,有良好的跨環境能力,但存在網路的效能損耗。

// parent.js

const = require('child_process');

const child = spawn('node', ['child'], );

child.stdio[3].on('data', data => );

// child.js

const net = require('net');

const pipe = net.socket();

pipe.write('killme');

執行

> node parent.js

222 killme

最強大的方式,既然要通訊,場景還複雜,不妨擴充套件出一層訊息中介軟體,漂亮地解決各種通訊問題.

訊息佇列可以參見 rabitmq

或者使用 redis 的訂閱發布,見下例

// parent.js

const cp = require('child_process');

const child = cp.fork(`child.js`);

var redis = require("ioredis");

var redis = new redis();

var pub = new redis();

// 訂閱 news 通道,

redis.subscribe("news", function (err, count) );

// 監聽 message 事件。

redis.on("message", function (channel, message)

// child.js

var redis = require("ioredis");

var pub = new redis();

// 發布新訊息

pub.publish("news", "hello world!");

pub.publish("music", "hello again!");

單機使用則直接 node 原生 ipc 最為省事,就如 eggjs 中 master 程序與 worker 程序的通訊。

但你的服務負載需要部署去了多台機器,筆者更建議使用訊息佇列的方式來相互通訊,畢竟追蹤多機的 websocket 鏈路,是挺頭疼的一件事。

php程序間通訊 yoc PHP程序間通訊

php是用c編寫的,因此它對系統底層api的操作與c很像,同大多數語言一樣,php程序間通訊的方式有以下幾種 訊息佇列,管道,共享記憶體,socket和訊號。本文是對這幾種通訊方式對整理 管道通訊pipe 管道用於承載簡稱之間的通訊資料。為了方便理解,可以將管道比作檔案,程序a將資料寫到管道p中,然...

程序間的通訊

程序間的通訊就麻煩一些了,訊號的種類就有 種,可以在終端中輸入kill l檢視!就先說幾個今天剛學的吧 sigint,這個訊號是由硬體產生的,比如按下ctrl c時就會產生這個訊號。sigalrm,這個訊號是由alrm unsigned int arg 函式產生的,就是間隔arg秒時間後產生siga...

程序間的通訊

可以用來通訊的有 管道 pipe 管道可用於具有親緣關係程序間的通訊,允許乙個程序和另乙個與它有共同祖先的程序之間進行通訊。命名管道 named pipe 命名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊。命名管道在檔案系統中有對應的檔名。命名管道通過...