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

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

发布时间:2019-08-15 19:32:31 所属栏目:建站 来源:koala
导读:媒介 历程与线程是一个措施员的必知观念,口试常常被问及,可是一些文章内容只是讲讲理论常识,也许一些小搭档并没有真的领略,在现实开拓中应用也较量少。本篇文章除了先容观念,通过Node.js 的角度讲授历程与线程,而且讲授一些在项目中的拭魅战的应用,让

照旧上面谁人例子,我们在按时器执行的同时,去读一个文件:

  1. const fs = require('fs') 
  2. setInterval(() => { 
  3.     console.log(new Date().getTime()) 
  4. }, 3000) 
  5.  
  6. fs.readFile('./index.html', () => {}) 

线程数目酿成了 11 个,这是由于在 Node 中有一些 IO 操纵(DNS,FS)和一些 CPU 麋集计较(Zlib,Crypto)会启用 Node 的线程池,而线程池默认巨细为 4,由于线程数酿成了 11。

我们可以手动变动线程池默认巨细:

  1. process.env.UV_THREADPOOL_SIZE = 64 

一行代码轻松把线程酿成 71。

Libuv

Libuv 是一个跨平台的异步IO库,它团结了UNIX下的libev和Windows下的IOCP的特征,最早由Node的作者开拓,专门为Node提供多平台下的异步IO支持。Libuv自己是由C++说话实现的,Node中的非苏塞IO以及变乱轮回的底层机制都是由libuv实现的。

libuv架构图

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

在Window情形下,libuv直接行使Windows的IOCP来实现异步IO。在非Windows情形下,libuv行使多线程来模仿异步IO。

留意下面我要说的话,Node的异法式用是由libuv来支持的,以上面的读取文件的例子,读文件实质的体系挪用是由libuv来完成的,Node只是认真挪用libuv的接口,等数据返回后再执行对应的回调要领。

Node.js 线程建设

直到 Node 10.5.0 的宣布,官刚刚给出了一个尝试性子的模块 worker_threads 给 Node 提供真正的多线程手段。

先看下简朴的 demo:

  1. const { 
  2.   isMainThread, 
  3.   parentPort, 
  4.   workerData, 
  5.   threadId, 
  6.   MessageChannel, 
  7.   MessagePort, 
  8.   Worker 
  9. } = require('worker_threads'); 
  10.  
  11. function mainThread() { 
  12.   for (let i = 0; i < 5; i++) { 
  13.     const worker = new Worker(__filename, { workerData: i }); 
  14.     worker.on('exit', code => { console.log(`main: worker stopped with exit code ${code}`); }); 
  15.     worker.on('message', msg => { 
  16.       console.log(`main: receive ${msg}`); 
  17.       worker.postMessage(msg + 1); 
  18.     }); 
  19.   } 
  20.  
  21. function workerThread() { 
  22.   console.log(`worker: workerDate ${workerData}`); 
  23.   parentPort.on('message', msg => { 
  24.     console.log(`worker: receive ${msg}`); 
  25.   }), 
  26.   parentPort.postMessage(workerData); 
  27.  
  28. if (isMainThread) { 
  29.   mainThread(); 
  30. } else { 
  31.   workerThread(); 

上述代码在主线程中开启五个子线程,而且主线程向子线程发送简朴的动静。

因为 worker_thread 今朝如故处于尝试阶段,以是启动时必要增进 --experimental-worker flag,运行后调查勾当监督器,开启了5个子线程

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

worker_thread 模块

worker_thread 焦点代码(地点https://github.com/nodejs/nod...)

(编辑:湖南网)

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

热点阅读