您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關nodejs中怎么實現兄弟進程通信,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
問題
盡管我們可以在主進程中保存工作進程的實例,但是想通過主進程,完成工作進程和進程A的通信還是非常麻煩,步驟如下
1 首先主進程要監聽每個工作進程發過來的任務
2 然后把任務傳給進程A
3 進程A處理完后,通知主進程,主進程再把結果發給對任務對應的子進程 其中,工作進程需要保存任務對應的上下文(比如說回調),因為工作進程可能同時給主進程發送了多個任務,當主進程通知工作進程某個任務完成的時候,工作進程需要通過任務找到對應的上下文,然后進行下一步處理,比如執行回調。
在主進程中開啟一個服務,實現沒有繼承關系的子進程間通信,選取的進程間通信方式是unix域,沒有選tcp是因為同主機的進程間通信,使用tcp過于重和低效(需要經過協議棧的封包和解包)。子進程可以通過該服務和主進程通信,然后主進程轉發請求給處理cpu型任務的子進程。結構如下在主進程而不是進程A中開啟unix域服務是因為以后新增處理其他任務的子進程時,可以復用該unix域服務,起到api網關的作用。但是多了一層,會多了一些通信的成本。更直接的可以使用以下結構
客戶端
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中怎么實現兄弟進程通信有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。