详解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与Ajax常用代码实现对比
Oct 03 Javascript
javascript实现上传图片并预览的效果实现代码
Apr 11 Javascript
jQuery判断元素是否是隐藏的代码
Apr 24 Javascript
js去字符串前后空格5种实现方法及比较
Apr 03 Javascript
Javascript实现真实字符串剩余字数提示的实例代码
Oct 22 Javascript
jQuery插件pagewalkthrough实现引导页效果
Jul 05 Javascript
javascript从定义到执行 你不知道的那些事
Jan 04 Javascript
vue的一个分页组件的示例代码
Dec 25 Javascript
bootstrap模态框关闭后清除模态框的数据方法
Aug 10 Javascript
ES6入门教程之Array.from()方法
Mar 23 Javascript
微信小程序 搜索框组件代码实例
Sep 06 Javascript
AJAX检测用户名是否存在的方法
Mar 24 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获取mysql版本的几种方法小结
2008/03/25 PHP
PHP中执行MYSQL事务解决数据写入不完整等情况
2014/01/07 PHP
简单实用的网站PHP缓存类实例
2014/07/18 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
基于laravel where的高级使用方法
2019/10/10 PHP
转换json格式的日期为Javascript对象的函数
2010/07/13 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
用nodejs写的一个简单项目打包工具
2013/05/11 NodeJs
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
javascript和HTML5利用canvas构建猜牌游戏实现算法
2013/07/17 Javascript
js实现身份证号码验证的简单实例
2014/02/19 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
原生JS实现响应式瀑布流布局
2015/04/02 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
聊一聊JavaScript作用域和作用域链
2016/05/03 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
Grunt针对静态文件的压缩,版本控制打包的实例讲解
2017/09/29 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
Vue移动端实现图片上传及超过1M压缩上传
2019/12/23 Javascript
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
python字符串常用方法
2018/06/14 Python
python实现将文件夹内的每张图片批量分割成多张
2019/07/22 Python
pandas数据分组groupby()和统计函数agg()的使用
2021/03/04 Python
荷兰街头时尚之家:Funkie House
2019/03/18 全球购物
法国高保真音响和家庭影院商店:Son Video
2019/04/26 全球购物
本科毕业生专业自荐书范文
2014/02/05 职场文书
《童趣》教学反思
2014/02/19 职场文书
工作说明书格式
2014/07/29 职场文书
pycharm无法导入lxml的解决办法
2021/03/31 Python
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
MySQL如何解决幻读问题
2021/08/07 MySQL
Python可变集合和不可变集合的构造方法大全
2021/12/06 Python
Java设计模式之代理模式
2022/04/22 Java/Android
详解Anyscript开发指南绕过typescript类型检查
2022/09/23 Javascript