详解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 相关文章推荐
Mootools 1.2教程(2) DOM选择器
Sep 14 Javascript
不同浏览器对回车提交表单的处理办法
Feb 13 Javascript
让人期待的2011年度最佳 jQuery 插件分享
Mar 16 Javascript
一个关于javascript匿名函数的问题分析
Mar 30 Javascript
纯js分页代码(简洁实用)
Nov 05 Javascript
extjs 如何给column 加上提示
Jul 29 Javascript
异步JavaScript编程中的Promise使用方法
Jul 28 Javascript
JavaScript中的遍历详解(多种遍历)
Apr 07 Javascript
AngularJS全局警告框实现方法示例
May 18 Javascript
Vue axios 中提交表单数据(含上传文件)
Jul 06 Javascript
ECharts地图绘制和钻取简易接口详解
Jul 12 Javascript
原生js实现购物车
Sep 23 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
这部好评如潮的动漫 知名梗频出 但是画风劝退很多人
2020/03/08 日漫
PHP中simplexml_load_string函数使用说明
2011/01/01 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
浅析PHP中strlen和mb_strlen的区别
2014/08/31 PHP
php判断一个数组是否为有序的方法
2015/03/27 PHP
thinkphp分页实现效果
2016/10/13 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
对YUI扩展的Gird组件 Part-2
2007/03/10 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
js将当前时间格式转换成时间搓(自写)
2013/09/26 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
javascript 数组操作详解
2015/01/29 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
JS获取年月日时分秒的方法分析
2016/11/28 Javascript
Angular.JS中指令ng-if的注意事项小结
2017/06/21 Javascript
vue自定义过滤器创建和使用方法详解
2017/11/06 Javascript
浅谈es6中export和export default的作用及区别
2018/02/07 Javascript
详解vue中移动端自适应方案
2019/05/05 Javascript
在Python中使用SimpleParse模块进行解析的教程
2015/04/11 Python
Python实现字符串与数组相互转换功能示例
2017/09/22 Python
django进阶之cookie和session的使用示例
2018/08/17 Python
pandas DataFrame索引行列的实现
2019/06/04 Python
Python图像处理库PIL中图像格式转换的实现
2020/02/26 Python
django ListView的使用 ListView中获取url中的参数值方式
2020/03/27 Python
keras的load_model实现加载含有参数的自定义模型
2020/06/22 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
Omio波兰:全欧洲低价大巴、火车和航班搜索和比价
2018/02/16 全球购物
龟牌英国商店:Turtle Wax Brand Store UK
2019/07/02 全球购物
建筑工程专业学生的自我评价
2013/12/25 职场文书
物流专业大学生职业生涯规划书范文
2014/01/15 职场文书
优秀的导游求职信范文
2014/04/06 职场文书
优秀护士演讲稿
2014/04/30 职场文书
债务纠纷委托书范本
2014/10/14 职场文书
2014年镇党建工作汇报材料
2014/11/02 职场文书
干部考察材料范文
2014/12/24 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书