详解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 操作符实例代码
Oct 24 Javascript
document.documentElement的一些使用技巧
Apr 18 Javascript
javascript包装对象实例分析
Mar 27 Javascript
javascript实现图片跟随鼠标移动效果的方法
May 13 Javascript
用svg制作富有动态的tooltip
Jul 17 Javascript
javascript获取网页各种高宽及位置的方法总结
Jul 27 Javascript
概述VUE2.0不可忽视的很多变化
Sep 25 Javascript
微信js-sdk分享功能接口常用逻辑封装示例
Oct 13 Javascript
JavaScript的事件机制详解
Jan 17 Javascript
mint-ui 时间插件使用及获取选择值的方法
Feb 09 Javascript
vue实现引入本地json的方法分析
Jul 12 Javascript
解决vue-cli3 使用子目录部署问题
Jul 19 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下过滤html代码的函数 提高程序安全性
2010/03/02 PHP
解析php二分法查找数组是否包含某一元素
2013/05/23 PHP
js实现网站首页图片滚动显示
2013/02/04 Javascript
JavaScript网页定位详解
2014/01/13 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
2015/03/15 Javascript
javascript适合移动端的日期时间拾取器
2015/11/10 Javascript
jQuery实现简单隔行变色的方法
2016/02/20 Javascript
利用JQuery直接调用asp.net后台的简单方法
2016/10/27 Javascript
webpack常用配置项配置文件介绍
2016/11/07 Javascript
通过bootstrap全面学习less
2016/11/09 Javascript
vue 设置路由的登录权限的方法
2018/07/03 Javascript
详解使用VueJS开发项目中的兼容问题
2018/08/02 Javascript
Javascript格式化并高亮xml字符串的方法及注意事项
2018/08/13 Javascript
微信小程序全局变量改变监听的实现方法
2019/07/15 Javascript
layui表单验证select下拉框实现验证的方法
2019/09/05 Javascript
vue+elementui 对话框取消 表单验证重置示例
2019/10/29 Javascript
[01:04:01]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第一场
2014/05/24 DOTA
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
[53:10]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs VG 第一场
2018/04/11 DOTA
[44:37]完美世界DOTA2联赛PWL S3 Forest vs access 第一场 12.11
2020/12/13 DOTA
Python中为什么要用self探讨
2015/04/14 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
2016/03/30 Python
Python 模块EasyGui详细介绍
2017/02/19 Python
Python实现多线程抓取网页功能实例详解
2017/06/08 Python
Python分支结构(switch)操作简介
2018/01/17 Python
Python简易版停车管理系统
2019/08/12 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
Python叠加矩形框图层2种方法及效果
2020/06/18 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
哈利波特商店:Harry Potter Shop
2018/11/30 全球购物
领导干部考察材料
2014/02/08 职场文书
空乘英文求职信
2014/04/13 职场文书
办公用房租赁协议书
2014/11/29 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
MySQL查询学习之基础查询操作
2021/05/08 MySQL
php实现自动生成验证码的实例讲解
2021/11/17 PHP