设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 文件
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

深入理解Node.js 进程与线程(8000字长文彻底搞懂)(3)

发布时间:2019-08-15 16:27 所属栏目:21 来源:koala
导读:针对文初需要进行计算的的例子我们创建子进程拆分出来单独进行运算。 constcomputation=()={ letsum=0; console.info('计算开始'); console.time('计算耗时'); for(leti=0;i1e10;i++){ sum+=i }; console.info('计

针对文初需要进行计算的的例子我们创建子进程拆分出来单独进行运算。

  1. const computation = () => { 
  2.     let sum = 0; 
  3.     console.info('计算开始'); 
  4.     console.time('计算耗时'); 
  5.  
  6.     for (let i = 0; i < 1e10; i++) { 
  7.         sum += i 
  8.     }; 
  9.  
  10.     console.info('计算结束'); 
  11.     console.timeEnd('计算耗时'); 
  12.     return sum; 
  13. }; 
  14.  
  15. process.on('message', msg => { 
  16.     console.log(msg, 'process.pid', process.pid); // 子进程id 
  17.     const sum = computation(); 
  18.  
  19.     // 如果Node.js进程是通过进程间通信产生的,那么,process.send()方法可以用来给父进程发送消息 
  20.     process.send(sum); 
  21. }) 

cluster模块

cluster 开启子进程Demo

  1. const http = require('http'); 
  2. const numCPUs = require('os').cpus().length; 
  3. const cluster = require('cluster'); 
  4. if(cluster.isMaster){ 
  5.     console.log('Master proces id is',process.pid); 
  6.     // fork workers 
  7.     for(let i= 0;i<numCPUs;i++){ 
  8.         cluster.fork(); 
  9.     } 
  10.     cluster.on('exit',function(worker,code,signal){ 
  11.         console.log('worker process died,id',worker.process.pid) 
  12.     }) 
  13. }else{ 
  14.     // Worker可以共享同一个TCP连接 
  15.     // 这里是一个http服务器 
  16.     http.createServer(function(req,res){ 
  17.         res.writeHead(200); 
  18.         res.end('hello word'); 
  19.     }).listen(8000); 
  20.  

cluster原理分析

深入理解Node.js 进程与线程(8000字长文彻底搞懂)

cluster模块调用fork方法来创建子进程,该方法与child_process中的fork是同一个方法。

cluster模块采用的是经典的主从模型,Cluster会创建一个master,然后根据你指定的数量复制出多个子进程,可以使用cluster.isMaster属性判断当前进程是master还是worker(工作进程)。由master进程来管理所有的子进程,主进程不负责具体的任务处理,主要工作是负责调度和管理。

cluster模块使用内置的负载均衡来更好地处理线程之间的压力,该负载均衡使用了Round-robin算法(也被称之为循环算法)。当使用Round-robin调度策略时,master accepts()所有传入的连接请求,然后将相应的TCP请求处理发送给选中的工作进程(该方式仍然通过IPC来进行通信)。

开启多进程时候端口疑问讲解:如果多个Node进程监听同一个端口时会出现 Error:listen EADDRIUNS的错误,而cluster模块为什么可以让多个子进程监听同一个端口呢?原因是master进程内部启动了一个TCP服务器,而真正监听端口的只有这个服务器,当来自前端的请求触发服务器的connection事件后,master会将对应的socket具柄发送给子进程。

child_process 模块与cluster 模块总结

无论是 child_process 模块还是 cluster 模块,为了解决 Node.js 实例单线程运行,无法利用多核 CPU 的问题而出现的。核心就是父进程(即 master 进程)负责监听端口,接收到新的请求后将其分发给下面的 worker 进程。

cluster模块的一个弊端:

深入理解Node.js 进程与线程(8000字长文彻底搞懂)

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读