Node.js 线程你理解的可能是错的

本文代码运行环境 系统:MacOS High Sierra Node.js:10.3.0 复制代码

Node.js是单线程的,那么Node.js启动后线程数是1?

答案:Node.js启动后线程数并不是1,以下面代码为例

const http = require('http');  http.createServer((req, res) => {     res.end('hello'); }).listen(8000, () => {   console.log('server is listening: ' + 8000); }); 复制代码

通过Mac实用工具 > 活动监视器可以查看进程的线程数其实是6


Node.js启动的线程数不为1,是因为线程池?

答案:线程数不为1,不是因为线程池,而是因为V8。Node.js启动后会创建V8实例,V8实例是多线程的,V8中的线程有:

  • 主线程:获取代码、编译执行
  • 编译线程:主线程执行的时候,可以优化代码
  • Profiler线程:记录哪些方法耗时,为优化提供支持
  • 其他线程:用于垃圾回收清除工作,因为是多个线程,所以可以并行清除

Node.js线程池是预先创建好的?

答案:并不是,线程池中的线程是按需创建的。

const http = require('http'); const fs = require('fs');  http.createServer((req, res) => {   fs.readFile('./c.js', () => {});   res.end('hello'); }).listen(8000, () => {   console.log('server is listening: ' + 8000); }); 复制代码

上面代码启动后,线程数依然是6


通过ab模拟访问后

ab -n1000 -c20 'http://192.168.76.101:8000/' 复制代码

线程数才变成了10。之所以为10,是因为线程池中线程的默认值是4。

异步IO都要占用线程池?

答案:并不是,网络IO不会占用线程池

const http = require('http');  http.createServer((req, res) => {   http.get('http://192.168.1.100');   res.end('hello'); }).listen(8000, () => {   console.log('server is listening: ' + 8000); }); 复制代码

上面这段代码,使用ab压测

ab -n10000 -c20 'http://192.168.76.101:8000' 复制代码

无论多少次访问都不会创建线程,线程数永远为6。

文件IO一定会占用线程池?

答案:并不是,*Sync会阻塞主线程所以不会占用线程池,另外fs.FSWatcher也不会占用线程池。

虽然官方文档里面提到了fs.FSWatcher,但是其实并不能直接调用,关于FSWatcher访问 StackOverflow上有一个相关的提问stackoverflow.com/questions/3…

线程池只能用于异步IO?

答案:并不是,除了一些IO密集操作外,Node.js对一些CPU密集的操作也会放到线程池里面执行(Crypto、Zlib模块)


DNS查询也有可能占用线程池?

答案:是的,因为dns.lookup方法会涉及到读取本地文件(例如nsswitch.conf,resolv.conf以及 /etc/hosts)。而dns.resolve方法就不会占用线程池,这也是lookup和resolve的区别所在。

所以下面的代码,其实是会占用线程池的,因为http.get在dns解析的时候默认使用的是lookup方法。

const http = require('http');  http.createServer((req, res) => {   http.get('http://bj.meituan.com');   res.end('hello'); }).listen(8000, () => {   console.log('server is listening: ' + 8000); }); 复制代码

线程池只供Node.js核心模块内部使用?

答案:不是的,官方文档里面有如下描述

You can use the built-in Node Worker Pool by developing a C++ addon. On older versions of Node, build your C++ addon using NAN, and on newer versions use N-API. node-webworker-threads offers a JavaScript-only way to access Node's Worker Pool.

线程池内线程数可以为0吗,可以无限大吗?

答案:不可以为0,也不是无限大的。通过UV_THREADPOOL_SIZE可以修改线程池的线程数(默认为4),线程数最大值为128,最小值为1。

主线程任何时候都不会阻塞吗?

答案:不是的,主线程在特定的情况下是会阻塞的。Node.js的事件循环中有一个阶段是poll,poll阶段在特定情况下是会阻塞的。这就是下图服务启动起来没有任何用户请求的时候Event Loop执行一次的时间比有少量请求的时候还要长的原因。


图片来源:https://medium.com/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and-its-metrics-c4907b19da4c

参考资料

https://nodejs.org/en/docs/guides/dont-block-the-event-loop/ https://medium.freecodecamp.org/what-exactly-is-node-js-ae36e97449f5 https://medium.com/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and-its-metrics-c4907b19da4c https://jsblog.insiderattack.net/event-loop-and-the-big-picture-nodejs-event-loop-part-1-1cb67a182810

转载于:https://www.cnblogs.com/wxmdevelop/p/10303948.html

nodejs v8引擎相关推荐

  1. Nodejs V8引擎 fast property lookup

    前言 之所以会研究这个东西,是我在网上找了一下各个语言的执行效率比较.好吧,我承认这是个无聊的东西,不过看看总是无妨,然而我惊讶的发现,有些测试声称Java,C,Nodejs是处在同一个效率级别参见链 ...

  2. JavaScript怎么安装_几句话说清楚JavaScript、V8引擎、NodeJS、NMP,到底是什么东东...

    小程序开发如火如荼,如果你是程序员,你还不懂小程序的开发,恐怕会被同行认为太LOW了吧!不过,新入行小程序开发者确实会被新的名词搞得一头雾水. 比如JavaScript不是在浏览器端运行吗,怎么还可以 ...

  3. 深入出不来nodejs源码-V8引擎初探

    原本打算是把node源码看得差不多了再去深入V8的,但是这两者基本上没办法分开讲. 与express是基于node的封装不同,node是基于V8的一个应用,源码内容已经渗透到V8层面,因此这章简述一下 ...

  4. Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略

    V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...

  5. node JS獲取GPS_Node.js 14 正式发布:V8 引擎升级,新增异步本地存储 API

    Node.js 14 版本于近日正式发布, 此版本包含的亮点如下: 对诊断功能的改进 升级 v8 引擎 新增实验性的异步本地存储 API 强化流 API 移除实验性模块中的警告 移除一部分早期版本中废 ...

  6. javascript的V8引擎的初步使用

    这段时间在使用javascript,常常地想javascript是怎么样运行呢?又是怎么样从JS代码转换为机器码呢?在深入了解JS运行机制之前,先来运行一下V8引擎也是入门的前奏.由于不能访问chro ...

  7. 技术期刊 · 吾令凤鸟飞腾兮 | 使用 esbuild 加速 webpack;网易云的熟人社交玩法;状态管理利器 XState;TypeScript 是如何工作的;深入浅出 V8 引擎

    蒲公英 · JELLY技术期刊 Vol.44 生命不息,学习无止,这是很多人一以贯之的追求,虽然在很多领域中,知识是无法穷尽的,但每一点细小的改变都能让自己可以更进一步,就好像离骚中所述," ...

  8. JavaScript工作原理(二):V8引擎和5招高效代码

    本系列的第一篇文章重点介绍了引擎,运行时和调用栈的概述.第二篇文章将深入V8的JavaScript引擎的内部.我们还会提供一些关于如何编写更好的JavaScript代码的技巧. 概述 JavaScri ...

  9. javascript清除map所占内存_【原创.54期】 JavaScript的V8引擎初探

    本文主要就下面三块内容展开 栈和堆空间 垃圾回收 解释器和编译器 一.栈空间和堆空间 先回顾下基本知识 1.静态语言就是强类型?二者的关系 (1-1)静态语言, 使用前 要确定数据类型 (1-2)动态 ...

最新文章

  1. Opencv中Homography
  2. 宏碁电脑开启虚拟化技术_开启windows电脑的cpu虚拟化(VT)图文操作步骤
  3. QT的QDialogButtonBox类的使用
  4. Gamma阶段第八次scrum meeting
  5. pyqt5使用按钮跳转界面
  6. 用c语言画图的步骤,怎样用c语言画图
  7. 01-信贷路由项目架构和 rose 框架的搭建
  8. 软件安全(开发模型、需求分析、测试)总结
  9. Spring boot内嵌tomcat日志配置
  10. dw中html网页如何加音乐播放器,在dreamweaver网页制作中插入音乐播放器详细参考...
  11. 关于微信小程序web开发者工具模拟器出现空白问题
  12. 身份证号码校验算法(附Python代码)
  13. 【旧资料整理】8086汇编 鼠标操作
  14. 百鸡问题扩展-N鸡问
  15. html颜色趋势,预测2015年网页设计配色趋势(4)
  16. Java学习笔记之基础语法(一)
  17. pandas 入门(pandas 数据结构介绍)
  18. 论文阅读 6 | Bayesian Meta-Learning for the Few-Shot Setting via Deep Kernels
  19. 课题三 数控机床的坐标系及编程规则
  20. 为了提高效率如何让Win7左右分屏

热门文章

  1. python中的magic方法
  2. 【CyberSecurityLearning 16】单臂路由与DHCP中继+ ICMP协议+VTP
  3. bootsect.s 预备——Linux-0.11 剖析笔记(一)
  4. Android 安全专项-Xposed 劫持用户名密码实践
  5. python读取json配置文件_Python简单读取json文件功能示例
  6. JZOJ 3597. 【CQOI2014】危桥
  7. STM32 端口复用与重映射及低功耗引脚配置
  8. abaqus linux 下载64位,SIMULIA ABAQUS 2016.0 Win64 Linux64 2DVD工程模拟的有限元
  9. QtGraphicView添加图元
  10. asp从后台调出的公式怎么参与运算_吴望一《流体力学》第一章中微分运算公式的初等证明...