详解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 相关文章推荐
IE8 chrome中table隔行换色解决办法
Jul 09 Javascript
9行javascript代码获取QQ群成员具体实现
Oct 16 Javascript
jquery操作checked属性以及disabled属性的多种方法
Jun 20 Javascript
JQuery实现防止退格键返回的方法
Feb 12 Javascript
jQuery实现仿微软首页感应鼠标变化滑动窗口效果
Oct 08 Javascript
Eclipse引入jquery报错如何解决
Dec 01 Javascript
Jq通过td获取同行其它列td的方法
Oct 05 Javascript
vue.js中Vue-router 2.0基础实践教程
May 08 Javascript
layui中的switch开关实现方法
Sep 03 Javascript
微信小程序一周时间表功能实现
Oct 17 Javascript
vue路由传参三种基本方式详解
Dec 09 Javascript
vue跳转页面的几种方法(推荐)
Mar 26 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/09/13 PHP
PHP哈希表实现算法原理解析
2020/12/11 PHP
js输出列表实现代码
2010/09/12 Javascript
JS扩展方法实例分析
2015/04/15 Javascript
JavaScript数组合并的多种方法
2016/05/22 Javascript
jQuery实现导航高亮的方法【附demo源码下载】
2016/11/09 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
利用vue和element-ui设置表格内容分页的实例
2018/03/02 Javascript
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
2018/04/13 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
用Vue编写抽象组件的方法
2019/05/06 Javascript
bootstrap-table+treegrid实现树形表格
2019/07/26 Javascript
Nodejs 识别图片类型的方法
2019/08/15 NodeJs
详解JS预解析原理
2020/06/16 Javascript
Ant design vue中的联动选择取消操作
2020/10/31 Javascript
微信小程序自定义底部弹出框功能
2020/11/18 Javascript
深入解析Python中的lambda表达式的用法
2015/08/28 Python
Python循环语句中else的用法总结
2016/09/11 Python
Pycharm 2019 破解激活方法图文详解
2019/10/11 Python
Pycharm小白级简单使用教程
2020/01/08 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
Scrapy项目实战之爬取某社区用户详情
2020/09/17 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
HTML5中的新元素介绍
2008/10/17 HTML / CSS
JD Sports德国官网:英国领先的运动鞋和运动服饰零售商
2018/02/26 全球购物
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
恶意软件的定义
2014/11/12 面试题
电子信息毕业生自荐信
2013/11/16 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
校园广播稿精选
2014/10/01 职场文书
2016年教师寒假学习心得体会
2015/10/09 职场文书
python spilt()分隔字符串的实现示例
2021/05/21 Python
Mysql 如何实现多张无关联表查询数据并分页
2021/06/05 MySQL
Java常用工具类汇总 附示例代码
2021/06/26 Java/Android
python编程实现清理微信重复缓存文件
2021/11/01 Python