详解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 相关文章推荐
javascript Xml增删改查(IE下)操作实现代码
Jan 30 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
Mar 28 Javascript
DOM中事件处理概览与原理的全面解析
Aug 16 Javascript
基于JavaScript实现鼠标箭头移动图片跟着移动
Aug 30 Javascript
基于百度地图实现产品销售的单位位置查看功能设计与实现
Oct 21 Javascript
正则表达式,替换所有HTML标签的简单实例
Nov 28 Javascript
基于jQuery实现数字滚动效果
Jan 16 Javascript
vue下拉列表功能实例代码
Apr 08 Javascript
Vue中props的使用详解
Jun 15 Javascript
vue中将html字符串转换成html后遇到的问题小结
Dec 10 Javascript
JS实现简单tab选项卡切换
Oct 25 Javascript
JS 基本概念详细介绍
Oct 16 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
在javascript中如何得到中英文混合字符串的长度
2014/01/17 Javascript
angularjs封装bootstrap时间插件datetimepicker
2016/06/20 Javascript
jQuery实现背景滑动菜单
2016/12/02 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
2017/11/07 Javascript
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
vue init webpack myproject构建项目 ip不能访问的解决方法
2018/03/20 Javascript
基于Vue2-Calendar改进的日历组件(含中文使用说明)
2019/04/14 Javascript
[01:28:43]2014 DOTA2华西杯精英邀请赛5 24 DK VS CIS
2014/05/25 DOTA
python单线程实现多个定时器示例
2014/03/30 Python
python实现在控制台输入密码不显示的方法
2015/07/02 Python
python中input()与raw_input()的区别分析
2016/02/27 Python
Python网络爬虫出现乱码问题的解决方法
2017/01/05 Python
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
Python文件读写常见用法总结
2019/02/22 Python
10招!看骨灰级Pythoner玩转Python的方法
2019/04/15 Python
Python 实现微信防撤回功能
2019/04/29 Python
Python+PyQT5的子线程更新UI界面的实例
2019/06/14 Python
python文件操作seek()偏移量,读取指正到指定位置操作
2020/07/05 Python
Python操作Word批量生成合同的实现示例
2020/08/28 Python
如何使用Python进行PDF图片识别OCR
2021/01/22 Python
css3实现六边形边框的实例代码
2019/05/24 HTML / CSS
利用html5 canvas破解简单验证码及getImageData接口应用
2013/01/25 HTML / CSS
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
加拿大当代时尚服饰、配饰和鞋类专业零售商和制造商:LE CHÂTEAU
2017/10/06 全球购物
打架检讨书400字
2014/01/17 职场文书
中国文明网签名寄语
2014/01/18 职场文书
母亲七十大寿答谢词
2014/01/18 职场文书
个人合伙协议书范本
2014/10/14 职场文书
介绍信格式
2015/01/30 职场文书
2015年大学团支部工作总结
2015/05/13 职场文书
校运会广播稿
2015/08/19 职场文书
60句有关成长的名言
2019/09/04 职场文书
linux中nohup和后台运行进程查看及终止
2021/06/24 Python
Python+Selenium自动化环境搭建与操作基础详解
2022/03/13 Python