详解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 相关文章推荐
邮箱下拉自动填充选择示例代码附图
Apr 03 Javascript
js函数参数设置默认值的一种变通实现方法
May 26 Javascript
javascript中为某个元素指定事件的三种方式
Aug 07 Javascript
JavaScript通过字典进行字符串翻译转换的方法
Mar 19 Javascript
原生js实现autocomplete插件
Apr 14 Javascript
js实现String.Fomat的实例代码
Sep 02 Javascript
利用Node.JS实现邮件发送功能
Oct 21 Javascript
mui框架移动开发初体验详解
Oct 11 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
Jun 19 Javascript
JS实现炫酷雪花飘落效果
Aug 19 Javascript
vue中jsonp插件的使用方法示例
Sep 10 Javascript
解决vue2中使用elementUi打包报错的问题
Sep 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
PHP  实现等比压缩图片尺寸和大小实例代码
2016/10/08 PHP
PHP的cookie与session原理及用法详解
2019/09/27 PHP
Avengerls vs Newbee BO3 第一场2.18
2021/03/10 DOTA
简单的Jquery遮罩层代码实例
2013/11/14 Javascript
jquery复选框checkbox实现删除前判断
2014/04/20 Javascript
javascript表单验证和Window详解
2014/12/11 Javascript
JavaScript中的some()方法使用详解
2015/06/09 Javascript
js仿百度登录页实现拖动窗口效果
2016/03/11 Javascript
如何判断Javascript对象是否存在的简单实例
2016/05/18 Javascript
AngularJS bootstrap启动详解及实例代码
2016/09/14 Javascript
详解nodejs 文本操作模块-fs模块(一)
2016/12/22 NodeJs
详解nodejs 文本操作模块-fs模块(四)
2016/12/22 NodeJs
微信小程序 实现动态显示和隐藏某个控件
2017/04/27 Javascript
Require.JS中的几种define定义方式示例
2017/06/01 Javascript
基于JQuery的Ajax方法使用详解
2017/08/16 jQuery
vue mint-ui tabbar变组件使用
2018/05/04 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
[01:55]2014DOTA2国际邀请赛 BBC正赛第一天总结
2014/07/10 DOTA
python计算书页码的统计数字问题实例
2014/09/26 Python
Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
2016/04/23 Python
python做反被爬保护的方法
2019/07/01 Python
python实现大学人员管理系统
2019/10/25 Python
使用PyCharm进行远程开发和调试的实现
2019/11/04 Python
tensorflow 重置/清除计算图的实现
2020/01/19 Python
python线程join方法原理解析
2020/02/11 Python
python cookie反爬处理的实现
2020/11/01 Python
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
英文简历中的自我评价
2013/10/06 职场文书
动物科学专业毕业生的自我评价
2013/11/29 职场文书
医学院毕业生自荐信范文
2014/03/06 职场文书
高三上学期学习自我评价
2014/04/23 职场文书
信息技术国培研修日志
2015/11/13 职场文书
党风廉政建设心得体会(2016最新版)
2016/01/22 职场文书
MySQL获取所有分类的前N条记录
2021/05/07 MySQL
python 常用的异步框架汇总整理
2021/06/18 Python