详解node单线程实现高并发原理与node异步I/O

 更新时间:2017年09月21日 09:38:07   作者:dudeyouth  
本篇文章主要介绍了node单线程实现高并发原理与node异步I/O ,具有一定的参考价值,有兴趣的可以了解一下

一、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是单线程的

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • node.js中的querystring.unescape方法使用说明

    node.js中的querystring.unescape方法使用说明

    这篇文章主要介绍了node.js中的querystring.unescape方法使用说明,本文介绍了querystring.unescape的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • 使用Node.js实现Clean Architecture方法示例详解

    使用Node.js实现Clean Architecture方法示例详解

    这篇文章主要为大家介绍了使用Node.js实现Clean Architecture方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • nodejs连接mysql数据库简单封装示例-mysql模块

    nodejs连接mysql数据库简单封装示例-mysql模块

    本篇文章主要介绍了nodejs连接mysql数据库简单封装(mysql模块),具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-04-04
  • Node.js API详解之 dgram模块用法实例分析

    Node.js API详解之 dgram模块用法实例分析

    这篇文章主要介绍了Node.js API详解之 dgram模块用法,结合实例形式分析了Node.js API中dgram模块基本功能、函数、使用方法及操作注意事项,需要的朋友可以参考下
    2020-06-06
  • NodeJs 模仿SIP话机注册的方法

    NodeJs 模仿SIP话机注册的方法

    这篇文章主要介绍了NodeJs 模仿SIP话机注册的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • jQuery+koa2实现简单的Ajax请求的示例

    jQuery+koa2实现简单的Ajax请求的示例

    这篇文章主要介绍了jQuery+koa2实现简单的Ajax请求的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Node.js中的模块化,npm包管理器详解

    Node.js中的模块化,npm包管理器详解

    这篇文章主要介绍了node模块与npm包管理工具,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-09-09
  • NodeJS实现视频转码的示例代码

    NodeJS实现视频转码的示例代码

    本篇文章主要介绍了NodeJS实现视频转码的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-11-11
  • 用npm install时报错node-sass npm ERR command failed问题的解决方法

    用npm install时报错node-sass npm ERR command

    在用npm install时报错npm ERR! path D:…\node-sass和npm ERR! command failed 问题,本文给大家介绍了如何解决这个问题,文中通过图文给大家介绍的非常详细,需要的朋友可以参考下
    2024-03-03
  • node.js解决客户端请求数据里面中文乱码的事件方法

    node.js解决客户端请求数据里面中文乱码的事件方法

    本文主要介绍了node.js解决客户端请求数据里面中文乱码的事件方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12

最新评论