详解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 相关文章推荐
javascript 在firebug调试时用console.log的方法
May 10 Javascript
12款经典的白富美型—jquery图片轮播插件—前端开发必备
Jan 08 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
Aug 05 Javascript
JS 实现导航栏悬停效果(续)
Sep 24 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
Oct 17 Javascript
浅析Node.js实现HTTP文件下载
Aug 05 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
Sep 01 Javascript
jstl中判断list中是否包含某个值的简单方法
Oct 14 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
Jan 04 Javascript
jQuery Pagination分页插件_动力节点Java学院整理
Jul 17 jQuery
vue+element项目中过滤输入框特殊字符小结
Aug 07 Javascript
ES6的循环与可迭代对象示例详解
Jan 31 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应用JSON技巧讲解
2013/02/03 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
2017/08/30 PHP
php 字符串中是否包含指定字符串的多种方法
2018/04/12 PHP
PHP使用pdo实现事务处理操作示例
2018/09/05 PHP
用js实现的检测浏览器和系统的函数
2009/04/09 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
2010/08/12 Javascript
基于JQuery制作的产品广告效果
2010/12/08 Javascript
使用ajax+jqtransform实现动态加载select
2014/12/01 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
JavaScript中关联原型链属性特性
2016/02/13 Javascript
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
终于实现了!精彩的jquery弹幕效果
2016/07/18 Javascript
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
js获取当前周、上一周、下一周日期
2017/03/19 Javascript
JS实现图片预览的两种方式
2017/06/27 Javascript
Vue不能检测到Object/Array更新的情况的解决
2018/06/26 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
小程序日历控件使用方法详解
2018/12/29 Javascript
详解Vue demo实现商品列表的展示
2019/05/07 Javascript
jquery实现简易验证插件封装
2020/09/13 jQuery
在Python下尝试多线程编程
2015/04/28 Python
Python中将变量按行写入txt文本中的方法
2018/04/03 Python
python事件驱动event实现详解
2018/11/21 Python
Python生成器的使用方法和示例代码
2019/03/04 Python
PyQt5实现从主窗口打开子窗口的方法
2019/06/19 Python
详解python的变量缓存机制
2021/01/24 Python
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
手工制作的豪华英式沙发和沙发床:Willow & Hall
2019/05/03 全球购物
Android面试题附答案
2014/12/08 面试题
架构师岗位职责
2013/11/18 职场文书
超市总经理岗位职责
2014/02/02 职场文书
教师对学生的寄语
2014/04/03 职场文书
2014全年工作总结
2014/11/27 职场文书
初中军训感言
2015/08/01 职场文书
Pandas实现批量拆分与合并Excel的示例代码
2022/05/30 Python
Python如何加载模型并查看网络
2022/07/15 Python