我們都知道 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 命名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊。命名管道在檔案系統中有對應的檔名。命名管道通過...