2017-05-19 70 views
1

这是从API的NodeJS复制:集群的NodeJS不上市

我想要做的是做主人后台作业,并接受职工的HTTP请求。

如果我注释掉后台作业部分,它运行良好。

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`); 
} 

下面是日志:

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

netstat显示8000被关闭。的源码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