Javascript 端口查找竞争条件
我有一个master.js和一个slave.js 每当master.js需要更多的从机来处理数据时,它都会使用它们 在slave.js中Javascript 端口查找竞争条件,javascript,node.js,port,race-condition,Javascript,Node.js,Port,Race Condition,我有一个master.js和一个slave.js 每当master.js需要更多的从机来处理数据时,它都会使用它们 在slave.js中 portscanner.findAPortNotInUse(config.wss.start_port, config.wss.end_port) .then((port) => { httpsServer.listen(port); process.send('Connected and listening on : ' + port)
portscanner.findAPortNotInUse(config.wss.start_port, config.wss.end_port)
.then((port) => {
httpsServer.listen(port);
process.send('Connected and listening on : ' + port);
})
起始端口为11001,结束端口为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);
});
}
如何防止这种行为?您可以让主进程将端口号传输到从属进程
分叉时,您会自动打开主设备和从设备之间的通信通道。使用它
是一个关于子进程的好教程
我引述:
parent.js
slave.js
哦,我可以用。也送吗?美好的我只是在使用process.send来获取状态updates@DatNoHand我已经添加了通信的完整示例,您可以在提供的链接中找到。但是,家长应该如何知道哪些端口是打开的?当您是主控时,您可以保留有关您拥有的从属端口数量和可用端口的数据。当您启动一个新的从机时,为它提供一个可用的端口,该端口将从您保留的端口阵列中删除。
const { fork } = require('child_process');
const forked = fork('child.js');
forked.on('message', (msg) => {
console.log('Message from child', msg);
});
forked.send({ hello: 'world' });
process.on('message', (msg) => {
console.log('Message from parent:', msg);
});
let counter = 0;
setInterval(() => {
process.send({ counter: counter++ });
}, 1000);