港口寻找竞争条件

时间:2017-11-15 12:52:16

标签: javascript node.js port race-condition

我有一个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);
    });
}

如何防止此类行为?

1 个答案:

答案 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);