今天就跟大家聊聊有關(guān)nodejs中怎么實現(xiàn)兄弟進(jìn)程通信,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
巧家ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!
問題
盡管我們可以在主進(jìn)程中保存工作進(jìn)程的實例,但是想通過主進(jìn)程,完成工作進(jìn)程和進(jìn)程A的通信還是非常麻煩,步驟如下
1 首先主進(jìn)程要監(jiān)聽每個工作進(jìn)程發(fā)過來的任務(wù)
2 然后把任務(wù)傳給進(jìn)程A
3 進(jìn)程A處理完后,通知主進(jìn)程,主進(jìn)程再把結(jié)果發(fā)給對任務(wù)對應(yīng)的子進(jìn)程 其中,工作進(jìn)程需要保存任務(wù)對應(yīng)的上下文(比如說回調(diào)),因為工作進(jìn)程可能同時給主進(jìn)程發(fā)送了多個任務(wù),當(dāng)主進(jìn)程通知工作進(jìn)程某個任務(wù)完成的時候,工作進(jìn)程需要通過任務(wù)找到對應(yīng)的上下文,然后進(jìn)行下一步處理,比如執(zhí)行回調(diào)。
在主進(jìn)程中開啟一個服務(wù),實現(xiàn)沒有繼承關(guān)系的子進(jìn)程間通信,選取的進(jìn)程間通信方式是unix域,沒有選tcp是因為同主機的進(jìn)程間通信,使用tcp過于重和低效(需要經(jīng)過協(xié)議棧的封包和解包)。子進(jìn)程可以通過該服務(wù)和主進(jìn)程通信,然后主進(jìn)程轉(zhuǎn)發(fā)請求給處理cpu型任務(wù)的子進(jìn)程。結(jié)構(gòu)如下在主進(jìn)程而不是進(jìn)程A中開啟unix域服務(wù)是因為以后新增處理其他任務(wù)的子進(jìn)程時,可以復(fù)用該unix域服務(wù),起到api網(wǎng)關(guān)的作用。但是多了一層,會多了一些通信的成本。更直接的可以使用以下結(jié)構(gòu)
客戶端
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); }});
看完上述內(nèi)容,你們對nodejs中怎么實現(xiàn)兄弟進(jìn)程通信有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。
網(wǎng)頁題目:nodejs中怎么實現(xiàn)兄弟進(jìn)程通信
本文地址:http://jinyejixie.com/article30/ijjgpo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、ChatGPT、全網(wǎng)營銷推廣、網(wǎng)站排名、虛擬主機、企業(yè)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)