2017-05-19 1 views
1

을 나열하지 :Nodejs 클러스터는이 nodejs API에서 복사

는 내가 뭘 원하는 마스터에서 백그라운드 작업을 수행하고 근로자의 HTTP 요청을 수락하는 것입니다.

배경 작업 부분을 주석 처리하면 제대로 작동합니다.

Master 45476 is running 
Worker 45479 started 
Worker 45483 started 
Worker 45482 started 
Worker 45478 started 

그러나 netstat 쇼 8000가 닫혀 : 여기

const cluster = require('cluster'); 
const http = require('http'); 
const numCPUs = require('os').cpus().length; 
const sleep = require('sleep'); 

if (cluster.isMaster) { 
    console.log(`Master ${process.pid} is running`); 

    // Fork workers. 
    for (let i = 0; i < numCPUs; i++) { 
    cluster.fork(); 
    } 

    cluster.on('exit', (worker, code, signal) => { 
    console.log(`worker ${worker.process.pid} died`); 
    }); 


    // background jobs start 
    while(true) { 
    console.log(123) 
    sleep.sleep(1) // do_background_jobs() 
    } 
    // background jobs end 


} else { 
    // Workers can share any TCP connection 
    // In this case it is an HTTP server 
    http.createServer((req, res) => { 
    res.writeHead(200); 
    res.end('hello world\n'); 
    }).listen(8000); 

    console.log(`Worker ${process.pid} started`); 
} 

는 로그입니다. 의 소스 curl이 실패합니다.

답변

1

while 루프가 "event loop"을 차단하고있어 메인 프로세스에서 아무 것도 일어나지 않을 수 있습니다. while 루프를이 코드로 변환하여 IO를 차단하지 않도록해야합니다.

setInterval(() => { 
    console.log("123") 
}, 1000) 
+0

하지만 'Worker 45482 started'라는 것을 볼 수 있듯이, master는 차단되는 동안 왜 분리 된 작업자 프로세스도 차단됩니까? – Sato

+0

화면에 인쇄하는 코드는 주 프로세스 (console.log ..)에 있지만 주 프로세스가 사용 중이면 출력을 볼 수 없습니다. –

+0

'123' 출력을 볼 수 있습니다. 하지만 'Worker 45482 started'가 출력되기 때문에 작업자 프로세스의 http.createServer도 실행됩니다. 그러나 '8000' 포트는 열려 있지 않습니다. – Sato