2017-11-15 5 views
0

가 나는 master.js과 master.js 더 많은 노예가 데이터를 처리해야 할 때마다 slave.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이며 포트 지금 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

마스터 프로세스슬레이브으로 포트 번호를 전송할 수 있습니다.

하면 자동으로 마스터슬레이브 사이의 통신 채널을 열 분기합니다. 그걸 써.

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

아. 나도 사용할 수 있습니다. 좋은. 슬레이브에서 process.send를 사용하여 상태 업데이트를 얻었습니다. – DatNoHand

+1

@DatNoHand 제공된 전체 예제를 추가했습니다. 제공된 링크에서 찾을 수 있습니다. –

+0

그러나 부모는 어떤 포트가 열려 있는지 어떻게 알 수 있습니까? – DatNoHand