详解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判断函数
Aug 14 Javascript
jQuery过滤选择器:not()方法使用介绍
Apr 20 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
Dec 24 Javascript
JS代码实现table数据分页效果
May 26 Javascript
Javascript 基础---Ajax入门必看
Jul 06 Javascript
JavaScript定时器实现的原理分析
Dec 06 Javascript
前端主流框架vue学习笔记第一篇
Jul 26 Javascript
vuejs实现本地数据的筛选分页功能思路详解
Nov 15 Javascript
vue webpack开发访问后台接口全局配置的方法
Sep 18 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
Oct 02 Javascript
如何使用CSS3和JQuery easing 插件制作绚丽菜单
Jun 18 jQuery
关于angular引入ng-zorro的问题浅析
Sep 09 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中文本操作的类
2007/03/17 PHP
php将csv文件导入到mysql数据库的方法
2014/12/24 PHP
php通过递归方式复制目录和子目录的方法
2015/03/13 PHP
PHP的命令行命令使用指南
2015/08/18 PHP
PHP简单实现上一页下一页功能示例
2016/09/14 PHP
PHP面向对象程序设计组合模式与装饰模式详解
2016/12/02 PHP
PHP回调函数概念与用法实例分析
2017/11/03 PHP
PHP ADODB实现分页功能简单示例
2018/05/25 PHP
[JS]点出统计器
2020/10/11 Javascript
表单(FORM)的一些实用效果代码
2007/03/25 Javascript
js相册效果代码(点击创建即可)
2013/04/16 Javascript
JS OffsetParent属性深入解析
2014/01/13 Javascript
jQuery插件zTree实现的多选树效果示例
2017/03/08 Javascript
详解React+Koa实现服务端渲染(SSR)
2018/05/23 Javascript
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
微信小程序实现tab左右切换效果
2020/11/15 Javascript
在angularJs中进行数据遍历的2种方法
2018/10/08 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
2019/11/14 Javascript
JS 事件机制完整示例分析
2020/01/15 Javascript
Python的Tornado框架异步编程入门实例
2015/04/24 Python
利用Python爬虫给孩子起个好名字
2017/02/14 Python
Python实现中文数字转换为阿拉伯数字的方法示例
2017/05/26 Python
Django如何自定义分页
2018/09/25 Python
python中open函数的基本用法示例
2019/09/07 Python
python读写文件write和flush的实现方式
2020/02/21 Python
德国亚洲食品网上商店:asiafoodland.de
2019/12/28 全球购物
法国包包和行李箱销售网站:Bagage24.fr
2020/03/24 全球购物
信息专业个人的自我评价
2013/12/27 职场文书
英语专业毕业生自荐信范文
2013/12/31 职场文书
高中语文课后反思
2014/04/27 职场文书
2014年班务工作总结
2014/12/02 职场文书
先进班集体申报材料
2014/12/26 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python
微信小程序中wxs文件的一些妙用分享
2022/02/18 Javascript
JavaScript前端面试组合函数
2022/06/21 Javascript