2017-11-15 4 views
0

私は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); 
}) 

スタートポートは11001で、エンドポートが今時々slave4 11100

あると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

マスタプロセスは、スレーブにポート番号を送信することができます。

自動的マスタースレーブ間の通信チャネルを開くフォーク。これを使って。

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); 
+0

ああ、私も.sendを使用できますか?いいね私はスレーブのprocess.sendを使用して状態の更新を取得していました – DatNoHand

+1

@DatNoHand私は通信の完全な例を追加しました。提供されたリンクで見つけることができます。 –

+0

しかし、どのポートが開いているか、親はどのように知っていますか? – DatNoHand