加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

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

发布时间:2019-08-20 03:46:39 所属栏目:建站 来源:koala
导读:前言 进程与线程是一个程序员的必知概念,面试经常被问及,但是一些文章内容只是讲讲理论知识,可能一些小伙伴并没有真的理解,在实际开发中应用也比较少。本篇文章除了介绍概念,通过Node.js 的角度讲解进程与线程,并且讲解一些在项目中的实战的应用,让

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

  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 进程。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读