child_process.fork会提示端口占用 cluster.fork就不会这是为什么
server.js
var http = require('http');
const PORT=8888;
var server = http.createServer(function (request, response) {
response.end ("pid:"+process.pid);
});
server.on("listening",function(){
console.log('process ',process.pid,"listen at ",PORT);
});
server.listen(PORT);
用cluster启动四个 Server.js进程
var cluster = require('cluster');
if (cluster.isMaster) {
require('os').cpus().forEach(function(){
cluster.fork();
});
}else {
require('./server.js');
}
用child_process 启用4个 server.js进程
const cp = require('child_process');
require('os').cpus().forEach(function(){
cp.fork("./server.js");
});
提示Error: listen EADDRINUSE :::8888
这是什么原因?
3 回复
因为 cluster 不只是单纯地创建子进程,还实现了子进程间服务器端口的共享。具体原理你可以去看源代码,不过我水平不够看不懂。
印象中是 fork 创建子进程并创建 socket 文件,而 cluster 是共享 socket 文件,所以不会冲突,《深入浅出 Node.js》中有一个章节讲的还挺详细,可以参考一下