Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 端口查找竞争条件_Javascript_Node.js_Port_Race Condition - Fatal编程技术网

Javascript 端口查找竞争条件

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)

我有一个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);
})
起始端口为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);