详解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 相关文章推荐
ie 处理 gif动画 的onload 事件的一个 bug
Apr 12 Javascript
jquery的Theme和Theme Switcher使用小结
Sep 08 Javascript
javascript中的parseInt和parseFloat区别
Jul 12 Javascript
javascript框架设计之种子模块
Jun 23 Javascript
Bootstrap每天必学之工具提示(Tooltip)插件
Apr 26 Javascript
基于Bootstrap的UI扩展 StyleBootstrap
Jun 17 Javascript
Angularjs 依赖压缩及自定义过滤器写法
Feb 04 Javascript
JS通过调用微信API实现微信支付功能的方法示例
Jun 29 Javascript
js中怎么判断两个字符串相等的实例
Jan 17 Javascript
ajaxfileupload.js实现上传文件功能
Apr 19 Javascript
Vue项目中使用better-scroll实现菜单映射功能方法
Sep 11 Javascript
mpvue 项目初始化及实现授权登录的实现方法
Jul 20 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
动画 《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
PHP+MySQL 制作简单的留言本
2009/11/02 PHP
用PHP编写和读取XML的几种方式
2013/01/12 PHP
PHP 根据key 给二维数组分组
2016/12/09 PHP
PHP中PDO事务处理操作示例
2018/05/02 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
用JQUERY增删元素的代码
2012/02/14 Javascript
分享9个最好用的JavaScript开发工具和代码编辑器
2015/03/24 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
Javascript控制div属性动态变化实例分析
2015/10/08 Javascript
jquery调整表格行tr上下顺序实例讲解
2016/01/09 Javascript
jQuery实现下拉框功能实例代码
2016/05/06 Javascript
Vue-Router实现页面正在加载特效方法示例
2017/02/12 Javascript
JS实现的五级联动菜单效果完整实例
2017/02/23 Javascript
js实现从左向右滑动式轮播图效果
2017/07/07 Javascript
JavaScript的词法结构精华篇
2018/10/17 Javascript
vue.js的简单自动求和计算实例
2019/11/08 Javascript
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
Windows 7下Python Web环境搭建图文教程
2018/03/20 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
python对象与json相互转换的方法
2019/05/07 Python
python django生成迁移文件的实例
2019/08/31 Python
Python configparser模块应用过程解析
2020/08/14 Python
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
卫生安全检查制度
2014/02/04 职场文书
期终自我鉴定
2014/02/17 职场文书
支部鉴定材料
2014/06/02 职场文书
小学生2014国庆节演讲稿:祖国在我心中
2014/09/21 职场文书
2014年技术员工作总结
2014/11/18 职场文书
2015年事业单位工作总结
2015/04/27 职场文书
2015年副班长工作总结
2015/05/15 职场文书
话题作文之诚信
2019/11/28 职场文书
Pandas搭配lambda组合使用详解
2022/01/22 Python