nodejs v8引擎
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
nodejs v8引擎的更多相关文章
- Nodejs V8引擎 fast property lookup
前言 之所以会研究这个东西,是我在网上找了一下各个语言的执行效率比较.好吧,我承认这是个无聊的东西,不过看看总是无妨,然而我惊讶的发现,有些测试声称Java,C,Nodejs是处在同一个效率级别参见链 ...
- nodejs v8引擎c++编译版本号升级教程
原GCC版本号:4.4.7. 目标:升级GCC到4.8.2.以支持C++11. yum install gcc-c++ 获取GCC 4.8.2包:wget http://gcc.skazkaforyo ...
- 深入出不来nodejs源码-V8引擎初探
原本打算是把node源码看得差不多了再去深入V8的,但是这两者基本上没办法分开讲. 与express是基于node的封装不同,node是基于V8的一个应用,源码内容已经渗透到V8层面,因此这章简述一下 ...
- 浅谈V8引擎中的垃圾回收机制
最近在看<深入浅出nodejs>关于V8垃圾回收机制的章节,转自:http://blog.segmentfault.com/skyinlayer/1190000000440270 这篇文章 ...
- google v8引擎常见问题
最近在项目中使用v8来进行扩展,下面简单说一下使用v8过程中遇到的一些问题. v8的多线程调用 最初调研v8的测试代码是单线程的,后来一个项目在多线程中使用,出现了一些问题,后来看到参考3中的才恍 ...
- V8引擎——详解
前言 JavaScript绝对是最火的编程语言之一,一直具有很大的用户群,随着在服务端的使用(NodeJs),更是爆发了极强的生命力.编程语言分为编译型语言和解释型语言两类,编译型语言在执行之前要先进 ...
- Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略
V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...
- v8引擎详解
引用网址: https://blog.csdn.net/swimming_in_it_/article/details/78869549 前言 JavaScript绝对是最火的编程语言之一,一直具有很 ...
- Node.js和Chrome V8 引擎了解
说起Node就不得不先介绍一个Chrome V8 引擎. 随着Web相关技术的发展,JavaScript所要承担的工作也越来越多,早就超越了“表单验证”的范畴,这就更需要快速的解析和执行JavaScr ...
随机推荐
- Java初学者笔记三:关于字符串和自实现数组常见操作以及异常处理
一.字符串常见的操作 1.结合我在python中对于字符串常见处理总结出下面三个应该能算是字符串造作的TOP 3 //字符串查找子串,存在返回index,不存在返回-1 等于python的find: ...
- Tomcat远程任意代码执行漏洞及其POC(CVE-2017-12617)
一.原理分析: 只需参数readonly设置为false或者使用参数readonly设置启用WebDAV servlet false,则Tomcat可以不经任何身份验证的控制直接接收PUT方式上传的文 ...
- java 空间四点定位,可跟据已知的四点坐标(x,y,z)及距离计算所在位置坐标
public static void main(String args[]) { try{ float point[]=new float[3]; Location loc = new Locatio ...
- 图片转成base64的字符串, 如何让图片在html中显示
图片在服务端已编码成base64的字符串放在xml里面,客户端接受xml,取得base64的字符串后,请问如何让图片在html中显示? <img src="data:image/png ...
- 云笔记类APP推荐
一.思绪收集类 Google Keep - 记事和清单 - Google Play 上的应用 注:谷歌 Keep 是最方便的收集思绪 APP 了.卡片视图,反应迅速,流畅,UI 漂亮,功能齐全,唯一不 ...
- Apache POI 读写 Excel 文件
目录 写入 Excel 文件 读取 Excel 文件 遍历 Excel 文件 需要的 maven 依赖 完整代码 写入 Excel 文件 // 写入 Excel 文件 // ============= ...
- saltstack相关
通过saltstack实现根据不同业务特性进行配置集中化管理,分发文件,采集服务器数据,操作系统基础及软件包管理等第一层为web交互层,采用django+mysql+bootstarp实现,服务端采用 ...
- Cocos2d-x学习笔记(17)(TestCpp源代码分析-1)
TestCpp源代码基于Cocos2d-x2.1.3版本号,部分资源来自红孩儿的游戏编程之路CSDN博客地址http://blog.csdn.net/honghaier/article/details ...
- Windows mysql默认字符集修改
一.通过MySQL命令行修改: set character_set_client=utf8; set character_set_connection=utf8; set character_set_ ...
- JOJ1202。重新操刀ACM,一天一练!做个简单的题目温习。
http://ac.jobdu.com/problem.php?pid=1202 题目描述: 对输入的n个数进行排序并输出. 输入: 输入的第一行包括一个整数n(1<=n<=100). ...