详解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 学习笔记(六)
Dec 31 Javascript
JQuery 常用操作代码
Mar 14 Javascript
JS获取网页图片name属性的方法
Apr 01 Javascript
javascript中Array()数组函数详解
Aug 23 Javascript
javascript实现自动输出文本(打字特效)
Aug 27 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
Oct 28 Javascript
js原生代码实现轮播图的实例讲解
Jul 28 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
Sep 30 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
Jan 21 Javascript
node(koa2) web应用模块介绍详解
Mar 29 Javascript
vue Element左侧无限级菜单实现
Jun 10 Javascript
vue2的 router在使用过程中遇到的一些问题
Apr 13 Vue.js
删除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数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
《PHP编程最快明白》第三讲:php数组
2010/11/01 PHP
PHP 输出URL的快捷方式示例代码
2013/09/22 PHP
ThinkPHP模型详解
2015/07/27 PHP
PHP框架Laravel中使用UUID实现数据分表操作示例
2018/05/30 PHP
Ext JS添加子组件的误区探讨
2013/06/28 Javascript
JavaScript实现QueryString获取GET参数的方法
2013/07/02 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
jQuery实现HTML5 placeholder效果实例
2014/12/09 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
AngularJS实现DOM元素的显示与隐藏功能
2016/11/22 Javascript
快速实现jQuery多级菜单效果
2017/02/01 Javascript
JavaScript函数基础详解
2017/02/03 Javascript
CentOS 安装NodeJS V8.0.0的方法
2017/06/15 NodeJs
JavaScript代码执行的先后顺序问题
2017/10/29 Javascript
微信小程序实现下载进度条的方法
2017/12/08 Javascript
vue 2.x 中axios 封装的get 和post方法
2018/02/28 Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
2018/05/17 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
详解JavaScript的内存空间、赋值和深浅拷贝
2019/04/17 Javascript
vue 引用自定义ttf、otf、在线字体的方法
2019/05/09 Javascript
[02:32]【DOTA2亚洲邀请赛】iceice,梦开始的地方
2017/03/13 DOTA
Python和php通信乱码问题解决方法
2014/04/15 Python
python网络编程示例(客户端与服务端)
2014/04/24 Python
Python 中 Virtualenv 和 pip 的简单用法详解
2017/08/18 Python
详解django的serializer序列化model几种方法
2018/10/16 Python
django中瀑布流写法实例代码
2019/10/14 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
自荐信格式的六要素
2013/09/21 职场文书
文员的职业生涯规划发展方向
2014/02/08 职场文书
文明寝室标语
2014/06/13 职场文书
田径运动会通讯稿
2014/09/13 职场文书
毕业生党员个人总结
2015/02/14 职场文书
求职简历自荐信怎么写
2015/03/26 职场文书
新郎接新娘保证书
2015/05/08 职场文书