详解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的版本实现执行不同的代码
May 11 Javascript
javascript获取选中的文本的方法代码
Oct 30 Javascript
javascript原生和jquery库实现iframe自适应高度和宽度
Jul 18 Javascript
JavaScript实现动态创建CSS样式规则方案
Sep 06 Javascript
使用javascript实现Iframe自适应高度
Dec 24 Javascript
jquery mobile开发常见问题分析
Jan 21 Javascript
使用bootstrap typeahead插件实现输入框自动补全之问题及解决办法
Jul 07 Javascript
Bootstrap页面标题Page Header的实现方法
Mar 22 Javascript
实例详解JavaScript中setTimeout函数的执行顺序
Jul 12 Javascript
React/Redux应用使用Async/Await的方法
Nov 16 Javascript
vue--点击当前增加class,其他删除class的方法
Sep 15 Javascript
Javascript数组方法reduce的妙用之处分享
Jun 10 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实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
PHP实现的简单操作SQLite数据库类与用法示例
2017/06/19 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
php操作mongodb封装类与用法实例
2018/09/01 PHP
Aster vs KG BO3 第三场2.18
2021/03/10 DOTA
基于逻辑运算的简单权限系统(实现) JS 版
2007/03/24 Javascript
JavaScript 拖拉缩放效果
2008/12/10 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
JS实现进入页面时渐变背景色的方法
2015/02/25 Javascript
javascript实现点击后变换按钮显示文字的方法
2015/05/13 Javascript
微信小程序 数据遍历的实现
2017/04/05 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
2017/04/10 jQuery
Vue.js实现一个todo-list的上移下移删除功能
2017/06/26 Javascript
详解如何让Express支持async/await
2017/10/09 Javascript
vue+egg+jwt实现登录验证的示例代码
2019/05/18 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
vue如何使用rem适配
2021/02/06 Vue.js
[02:05]2014DOTA2西雅图国际邀请赛 BBC第二天小组赛总结
2014/07/11 DOTA
Python的词法分析与语法分析
2013/05/18 Python
教你学会使用Python正则表达式
2017/09/07 Python
Java分治归并排序算法实例详解
2017/12/12 Python
Python实现的圆形绘制(画圆)示例
2018/01/31 Python
python3 读写文件换行符的方法
2018/04/09 Python
利用Python如何实现数据驱动的接口自动化测试
2018/05/11 Python
python argparser的具体使用
2019/11/10 Python
Python requests及aiohttp速度对比代码实例
2020/07/16 Python
Rossignol金鸡美国官网:始于1907年法国百年雪具品牌
2019/03/06 全球购物
分布式数据库需要考虑哪些问题
2013/12/08 面试题
农药学硕士毕业生自荐信
2013/09/25 职场文书
反腐倡廉主题教育活动总结
2015/05/07 职场文书
Python Parser的用法
2021/05/12 Python
基于angular实现树形二级表格
2021/10/16 Javascript
用JS创建一个录屏功能
2021/11/11 Javascript
frg-100简单操作(设置)说明
2022/04/05 无线电
Python开发五子棋小游戏
2022/04/28 Python