详解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 相关文章推荐
jquery ui dialog ie8出现滚动条的解决方法
Dec 06 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
Nov 21 Javascript
JS小功能(setInterval实现图片效果显示时间)实例代码
Nov 28 Javascript
JQuery中阻止事件冒泡几种方式及其区别介绍
Jan 15 Javascript
js获取页面description的方法
May 21 Javascript
JavaScript中使用concat()方法拼接字符串的教程
Jun 06 Javascript
移动端JQ插件hammer使用详解
Jul 03 Javascript
实例详解JavaScript获取链接参数的方法
Jan 01 Javascript
AngularJS实现给动态生成的元素绑定事件的方法
Dec 14 Javascript
Node.js连接postgreSQL并进行数据操作
Dec 18 Javascript
如何在微信小程序中存setStorage
Dec 13 Javascript
JavaScript实现简单的图片切换功能(实例代码)
Apr 10 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
让你的网站首页自动选择语言转跳
2006/12/06 PHP
php调用c接口无错版介绍
2014/03/11 PHP
php+ajax制作无刷新留言板
2015/10/27 PHP
PHP文件上传操作实例详解
2016/09/27 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
PHP获取数组中指定的一列实例
2017/12/27 PHP
nullJavascript中创建对象的五种方法实例
2013/05/07 Javascript
js字符串日期yyyy-MM-dd转化为date示例代码
2014/03/06 Javascript
在Ubuntu系统上安装Node.JS的教程
2015/10/15 Javascript
第二篇Bootstrap起步
2016/06/21 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
JavaScript获取短信验证码(周期性)
2016/12/29 Javascript
jQuery表格的维护和删除操作
2017/02/03 Javascript
js实现年月日表单三级联动
2020/04/17 Javascript
javascript九宫格图片随机打乱位置的实现方法
2017/03/15 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
2020/08/10 Javascript
js实现3D旋转效果
2020/08/18 Javascript
vue+elementui通用弹窗的实现(新增+编辑)
2021/01/07 Vue.js
在漏洞利用Python代码真的很爽
2007/08/26 Python
python基础教程之udp端口扫描
2014/02/10 Python
Python里disconnect UDP套接字的方法
2015/04/23 Python
Python应用03 使用PyQT制作视频播放器实例
2016/12/07 Python
python实现屏保计时器的示例代码
2018/08/08 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
Python编写万花尺图案实例
2021/01/03 Python
ziaja齐叶雅官方海外旗舰店:来自波兰的天然护肤品牌
2017/01/02 全球购物
英国领先的电动可调床制造商:Laybrook
2019/12/26 全球购物
SQL注入攻击的种类有哪些
2013/12/30 面试题
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
挂职个人工作总结
2015/03/05 职场文书
教师节随笔
2015/08/15 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书
详解MySQL数据库千万级数据查询和存储
2021/05/18 MySQL
微软团队与 NASA 科学家和惠普企业(HPE)的工程师合作
2022/04/21 数码科技