child_process.fork会提示端口占用 cluster.fork就不会这是为什么
发布于 6 年前 作者 yakczh 4304 次浏览 来自 问答

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');

}


http://localhost:8888 访问正常

用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》中有一个章节讲的还挺详细,可以参考一下

回到顶部