详解node单线程实现高并发原理与node异步I/O


Posted in Javascript onSeptember 21, 2017

一、node单线程实现高并发原理

众所周知nodejs是单线程且支持高并发的脚本语言。可为什么单线程的nodejs可以支持高并发呢?很多人都不明白其原理,下面我来谈谈我的理解:

1. node的优点:I/O密集型处理是node的强项,因为node的I/O请求都是异步的(如:sql查询请求、文件流操作操作请求、http请求...)

a. 什么是异步?

异步:发出操作指令,然后就可以去做别的事情了,所有操作完成后再执行回调

异步的实现原理: 

// 第一步:定义变量
let a = 1;

// 第二步:发出指令,然后把回调函数加入异步队列(回调函数并没有执行)
setTimeout(() => {
 console.log(a);
}, 0)
// 第三步:赋值,回调函数没有执行
a = 2;
// 第四步:发出指令,然后把回调函数加入异步队列(回调函数并没有执行)
setTimeout(() => {
 console.log(a);
}, 0)
// 第五步:赋值,回调函数没有执行
a = 3;
// 当所有代码执行完毕,cpu空闲下来了,就会开始执行异步队列里面的回调函数
// 所以最后控制台输出:3 3

b. 什么是异步I/O?

异步I/O顾名思义就是异步的发出I/O请求

c. 虽然nodejs可以异步的发出I/O请求,但nodejs不支持多线程,为啥就可以支持高并发呢?

因为nodejs的I/O操作,底层是开启了多线程的

当同时有多个IO请求时,主线程会创建多个eio线程,以提高IO请求的处理速度

额外知识点:

d. 虽然nodejs的I/O操作开启了多线程,但是所有线程都是基于主线程开启的只能跑在一个进程当中还是不能充分利用cpu资源

pm2进程管理器可以解决这个问题

pm2 是一个带有负载均衡功能的Node应用的进程管理器.

e. cpu核数与线程之间的关系

在过去单CPU时代,单任务在一个时间点只能执行单一程序。之后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并不是真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操作系统来完成多任务间对CPU的运行切换,以使得每个任务都有机会获得一定的时间片运行。而现在多核CPU的情况下,同一时间点可以执行多个任务,具体到这个任务在CPU哪个核上运行,这个就跟操作系统和CPU本身的设计相关了

2. node的缺点:不擅长cpu密集型的操作

a. 什么是cpu密集型操作(复杂的运算、图片的操作)

// 这就是一个cpu密集型的操作
for (let i = 0; i < 1000000; i++) {
 console.log(i);
}

b. nodejs为什么不擅长cpu密集型操作

因为nodejs是单线程的

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
Jun 14 Javascript
js使用removeChild方法动态删除div元素
Aug 01 Javascript
jQuery简单实现图片预加载
Apr 20 Javascript
JavaScript中for循环的使用详解
Jun 03 Javascript
jQuery实现气球弹出框式的侧边导航菜单效果
Sep 22 Javascript
原生js编写autoComplete插件
Apr 13 Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
May 03 Javascript
vue中如何实现变量和字符串拼接
Jun 19 Javascript
js自定义trim函数实现删除两端空格功能
Feb 09 Javascript
Vue条件循环判断+计算属性+绑定样式v-bind的实例
Sep 18 Javascript
jQuery实现数字自动增加或者减少的动画效果示例
Dec 11 jQuery
微信小程序点击滚动到指定位置的实现
May 22 Javascript
删除table表格行的实例讲解
Sep 21 #Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
Sep 21 #Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
Sep 21 #Javascript
详解JavaScript中的六种错误类型
Sep 21 #Javascript
解决Vue编译时写在style中的路径问题
Sep 21 #Javascript
使用JS实现图片轮播的实例(前后首尾相接)
Sep 21 #Javascript
Node调用Java的示例代码
Sep 20 #Javascript
You might like
曾在DC漫画界反派角色扮演的演员,谁才是你心目中的小丑之王?
2020/04/09 欧美动漫
php 分页类 扩展代码
2009/06/11 PHP
php管理nginx虚拟主机shell脚本实例
2014/11/19 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
2018/07/21 PHP
php中的依赖注入实例详解
2019/08/14 PHP
一个可绑定数据源的jQuery数据表格插件
2010/07/17 Javascript
js类型检查实现代码
2010/10/29 Javascript
javascript 闭包
2011/09/15 Javascript
Textbox控件注册回车事件及触发按钮提交事件具体实现
2013/03/04 Javascript
js计算精度问题小结
2013/04/22 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/06/05 Javascript
JavaScript中对象property的删除方法介绍
2014/12/30 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
超级给力的JavaScript的React框架入门教程
2015/07/02 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
jquery中ajax跨域方法实例分析
2015/12/18 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
vue-router源码之history类的浅析
2019/05/21 Javascript
在vue中动态添加class类进行显示隐藏实例
2019/11/09 Javascript
vue中使用WX-JSSDK的两种方法(推荐)
2020/01/18 Javascript
24个解决实际问题的ES6代码片段(小结)
2020/02/02 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
[53:38]OG vs LGD 2018国际邀请赛淘汰赛BO3 第三场 8.26
2018/08/30 DOTA
Python request设置HTTPS代理代码解析
2018/02/12 Python
深入了解和应用Python 装饰器 @decorator
2019/04/02 Python
加拿大在线隐形眼镜专家:PerfectLens.ca
2016/11/19 全球购物
魅力惠奢品线上平台:MEI.COM
2016/11/29 全球购物
回馈慈善的设计师太阳镜:DIFF eyewear
2019/10/17 全球购物
初中生三年学习生活的自我评价
2013/11/03 职场文书
大学生个人简历自我评价
2013/11/16 职场文书
职称评定自我鉴定
2014/03/18 职场文书
学校校庆演讲稿
2014/05/22 职场文书
《妈妈别哭,有我在》读后感3篇
2020/01/13 职场文书
《吸血鬼:避世 血猎》官宣4.27发售 系列首款大逃杀
2022/04/03 其他游戏