详解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 textarea光标定位方法(兼容IE和FF)
Mar 12 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
Apr 24 Javascript
Java File类的常用方法总结
Mar 18 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
Aug 24 Javascript
浅谈jQuery中ajaxPrefilter的应用
Aug 01 Javascript
AngularJS 入门教程之事件处理器详解
Aug 19 Javascript
Zabbix添加Node.js监控的方法
Oct 20 Javascript
详解JavaScript常量定义
Jan 03 Javascript
JS基于递归实现网页版计算器的方法分析
Dec 20 Javascript
原生JS实现的碰撞检测功能示例
May 18 Javascript
JavaScript类型相关的常用操作总结
Feb 14 Javascript
Node.js中出现未捕获异常的处理方法
Jun 29 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+APACHE实现用户论证的方法
2006/10/09 PHP
浅析PHP递归函数返回值使用方法
2013/02/18 PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
2014/05/06 PHP
离开当前页面前使用js判断条件提示是否要离开页面
2014/05/02 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
Node.js的文件权限及读写flag详解
2016/10/11 Javascript
浅谈移动端之js touch事件 手势滑动事件
2016/11/07 Javascript
JavaScript中利用for循环遍历数组
2017/01/15 Javascript
详谈Ajax请求中的async:false/true的作用(ajax 在外部调用问题)
2017/02/10 Javascript
React.js中常用的ES6写法总结(推荐)
2017/05/09 Javascript
JavaScript编写的网页小游戏,很给力
2017/08/18 Javascript
微信小程序页面生命周期详解
2018/01/31 Javascript
vue 监听键盘回车事件详解 @keyup.enter || @keyup.enter.native
2018/08/25 Javascript
vue组件(全局,局部,动态加载组件)
2018/09/02 Javascript
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
js 根据对象数组中的属性进行排序实现代码
2019/09/12 Javascript
layui-table表复选框勾选的所有行数据获取的例子
2019/09/13 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
[02:00]DOTA2英雄COSPLAY闹市街头巡游助威2015国际邀请赛
2015/08/02 DOTA
python文件和目录操作方法大全(含实例)
2014/03/12 Python
Python使用函数默认值实现函数静态变量的方法
2014/08/18 Python
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
Python实现的双色球生成功能示例
2017/12/18 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
Python进阶之@property动态属性的实现
2019/04/01 Python
python设置环境变量的作用和实例
2019/07/09 Python
美国领先的精品家居照明和装饰产品在线零售商:LightsOnline.com
2018/01/23 全球购物
加州风格的游泳和沙滩装品牌:Cupshe
2019/06/10 全球购物
what is the difference between ext2 and ext3
2015/08/25 面试题
方正Java笔试题
2014/07/03 面试题
2014年商场工作总结
2014/11/22 职场文书
电力安全学习心得体会
2016/01/18 职场文书
2016开学第一课心得体会
2016/01/23 职场文书
悬疑名作《朋友游戏》动画无字ED宣传片 新角色公开
2022/04/13 日漫
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python