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

深入领略Node.js 历程与线程(8000字长文彻底搞懂)

发布时间:2019-08-15 19:32:31 所属栏目:建站 来源: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 历程。

(编辑:湖南网)

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

热点阅读