node单线程支撑高并发原理(node异步I/O)

1、node单线程实现高并发原理node

  众所周知nodejs是单线程且支持高并发的脚本语言。可为何单线程的nodejs能够支持高并发呢?不少人都不明白其原理,下面我来谈谈个人理解:sql

  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的node为何能够支持高并发呢?函数

      由于I/O操做是由node的工做线程去执行的(nodejs底层的libuv是多线程的线程池用来并行io操做),且主线程是不须要等待结果返回的,只要发出指令立刻就能够去忙其余事情了。   高并发

    额外知识点:spa

    c. 虽然nodejs的I/O操做开启了多线程,可是全部线程都是基于node服务进程开启的,并不能充分利用cpu资源操作系统

      pm2进程管理器能够解决这个问题

      pm2 是一个带有负载均衡功能的Node应用的进程管理器.

    d. cpu核数与线程之间的关系

      在过去单CPU时代,单任务在一个时间点只能执行单一程序。以后发展到多任务阶段,计算机能在同一时间点并行执行多任务或多进程。虽然并非真正意义上的“同一时间点”,而是多个任务或进程共享一个CPU,并交由操做系统来完成多任务间对CPU的运行切换,以使得每一个任务都有机会得到必定的时间片运行。而如今多核CPU的状况下,同一时间点能够执行多个任务,具体到这个任务在CPU哪一个核上运行,这个就跟操做系统和CPU自己的设计相关了

  2. node的缺点:不擅长cpu密集型的操做

    a. 什么是cpu密集型操做(复杂的运算、图片的操做)

// 这就是一个cpu密集型的操做
for
(let i = 0; i < 100000000; i++) { console.log(i); }

    b. nodejs为何不擅长cpu密集型操做

      由于nodejs是单线程的,进行密集型的运算会致使主线程挂起

相关文章
相关标签/搜索