详解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子类用Object.getPrototypeOf去调用父类方法解析
Dec 05 Javascript
JS去掉第一个字符和最后一个字符的实现代码
Feb 20 Javascript
javascript 中that的含义示例介绍
May 14 Javascript
JS获取下拉框显示值和判断单选按钮的方法
Jul 09 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
Jul 12 Javascript
jQuery中DOM节点删除之empty与remove
Jan 20 Javascript
javascript实现右下角广告框效果
Feb 01 Javascript
微信小程序之picker日期和时间选择器
Feb 09 Javascript
vue中实现左右联动的效果
Jun 22 Javascript
bootstrap自定义样式之bootstrap实现侧边导航栏功能
Sep 10 Javascript
什么时候不能在 Node.js 中使用 Lock Files
Jun 24 Javascript
typescript配置alias的详细步骤
Aug 12 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
PHP文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
php实现的短网址算法分享
2014/06/20 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
2016/07/18 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
Laravel6.18.19如何优雅的切换发件账户
2020/06/14 PHP
caller和callee的区别介绍及演示结果
2013/03/10 Javascript
JavaScript中创建类/对象的几种方法总结
2013/11/29 Javascript
一个奇葩的最短的 IE 版本判断JS脚本
2014/05/28 Javascript
JavaScript严格模式禁用With语句的原因
2014/10/20 Javascript
javascript最基本的函数汇总
2015/06/25 Javascript
JS实现网页Div层Clone拖拽效果
2015/09/26 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
2016/12/27 Javascript
如何用js判断dom是否有存在某class的值
2017/02/13 Javascript
vue实现验证码输入框组件
2017/12/14 Javascript
vue2.0+vue-dplayer实现hls播放的示例
2018/03/02 Javascript
如何获取TypeScript的声明文件.d.ts
2018/05/01 Javascript
使用Node.js实现一个多人游戏服务器引擎
2019/03/13 Javascript
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
2019/09/03 jQuery
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
2019/11/12 Javascript
element-ui封装一个Table模板组件的示例
2021/01/04 Javascript
Python中的类与对象之描述符详解
2015/03/27 Python
用python记录运行pid,并在需要时kill掉它们的实例
2017/01/16 Python
mac系统下Redis安装和使用步骤详解
2019/07/09 Python
pytorch 加载(.pth)格式的模型实例
2019/08/20 Python
Django2 连接MySQL及model测试实例分析
2019/12/10 Python
浅谈Python中的继承
2020/06/19 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
联想台湾官网:Lenovo TW
2018/05/09 全球购物
英国手机零售商:Carphone Warehouse
2018/06/06 全球购物
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
StudentUniverse英国:学生航班、酒店和旅游
2019/08/25 全球购物
党章培训心得体会
2014/09/04 职场文书
通知函的格式
2015/04/27 职场文书
2016大学生优秀志愿者事迹材料
2016/02/25 职场文书