我有一个master.js和一个slave.js
每当master.js需要更多的奴隶来处理数据时,它就会.fork。
在slave.js中(截断)
portscanner.findAPortNotInUse(config.wss.start_port, config.wss.end_port)
.then((port) => {
httpsServer.listen(port);
process.send('Connected and listening on : ' + port);
})
Start Port为11001,End Port为11100。
现在有时slave4和slave5都认为11004是免费的,都绑定到该端口并抛出EADDRINUSE。
master.js
function CreateSlave(mode, amount) {
return new Promise((res) => {
var c = connected_slaves;
for (var i = 0; i < amount; i++) {
var id = uuid.v4().split("-")[0];
slaves[c] = fork('/opt/nodeapps/ass/slave/server.js',
[serverKeyForSession, mode]);
slaves[c].id = id;
slaves[c].mode = mode;
AttachHandlerToSlave(c).then((res) => {
if (res) return;
});
c++;
}
});
}
function AttachHandlerToSlave(c) {
return new Promise((res, rej) => {
slaves[c].on('message', (msg) => {
console.log('\x1b[33m['+ slaves[c].id +'] | \x1b[0m'+msg);
});
res(true);
});
}
如何防止此类行为?
答案 0 :(得分:1)
您可以使主进程将端口号传输到从属。
分叉时,您会自动打开主和从属之间的通信渠道。使用它。
Here是一个关于子进程的好教程。
我引用:
<强> parent.js 强>
const { fork } = require('child_process');
const forked = fork('child.js');
forked.on('message', (msg) => {
console.log('Message from child', msg);
});
forked.send({ hello: 'world' });
<强> slave.js 强>
process.on('message', (msg) => {
console.log('Message from parent:', msg);
});
let counter = 0;
setInterval(() => {
process.send({ counter: counter++ });
}, 1000);