详解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 相关文章推荐
JS 控制非法字符的输入代码
Dec 04 Javascript
javascript中方便增删改cookie的一个类
Oct 11 Javascript
jQuery实现公告新闻自动滚屏效果实例代码
Jul 14 Javascript
同步异步动态引入js文件的几种方法总结
Sep 23 Javascript
vue的props实现子组件随父组件一起变化
Oct 27 Javascript
H5基于iScroll实现下拉刷新和上拉加载更多
Jul 18 Javascript
微信小程序自定义select下拉选项框组件的实现代码
Aug 28 Javascript
node实现socket链接与GPRS进行通信的方法
May 20 Javascript
JS实现查找数组中对象的属性值是否存在示例
May 24 Javascript
vue调用语音播放的方法
Sep 27 Javascript
vue中改变滚动条样式的方法
Mar 03 Javascript
解决vue axios跨域 Request Method: OPTIONS问题(预检请求)
Aug 14 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函数和特点
2013/08/08 PHP
php查看当前Session的ID实例
2015/03/16 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
2016/03/18 PHP
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
一个可绑定数据源的jQuery数据表格插件
2010/07/17 Javascript
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
JS判断对象是否存在的10种方法总结
2013/12/23 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
IE下支持文本框和密码框placeholder效果的JQuery插件分享
2015/01/31 Javascript
javascript中几个容易混淆的概念总结
2015/04/14 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
Jquery中map函数的用法
2016/06/03 Javascript
JS简单实现点击复制链接的方法
2016/08/03 Javascript
最细致的vue.js基础语法 值得收藏!
2016/11/03 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
JS作用域链详解
2017/06/26 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
vscode下的vue文件格式化问题
2018/11/28 Javascript
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
Python中optparse模块使用浅析
2015/01/01 Python
Python 实现 贪吃蛇大作战 代码分享
2016/09/07 Python
浅谈python之新式类
2018/08/12 Python
Python进阶之全面解读高级特性之切片
2019/02/19 Python
基于SpringBoot构造器注入循环依赖及解决方式
2020/04/26 Python
纯CSS3实现表单验证效果(非常不错)
2017/01/18 HTML / CSS
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
后勤采购员岗位职责
2013/12/19 职场文书
高二物理教学反思
2014/02/08 职场文书
学校创先争优活动总结
2014/08/28 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
2015年医院工作总结范文
2015/04/09 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
python 如何用terminal输入参数
2021/05/25 Python
python实现简单聊天功能
2021/07/07 Python