• 异步IO、事件驱动、 事件循环
  • Nodejs是使用JS实现高效可伸缩的高性能web服务
  • 单线程如何实现高并发? 是否存在缺点呢?

    单线程如何实现高并发?

  • 异步非阻塞IO配合事件回调通知

  • 程序代码当中,如果存在多个请求是无须阻塞的,会从上向下执行,然后会等待着libuv库完成工作之后,按照顺序通知相应的事件回调触发执行(这样单线程完成了单线程的工作)

    Nodejs主线程是单线程的

    单线程的优点
  • 因为Nodejs代码最终是由V8执行的,而在V8当中只有一个主线程来执行的我们的js代码(所以是平常所说的单线程)

  • libuv库当中存在线程池的(右边)
  • 请求分为:网络IO,非网络IO,以及非IO的异步操作
  • 网络IO,libuv库会调用当前平台的相对应的平台接口,进行处理
  • 另外两种IO会使用线程池当中的线程去处理
  • 如果这四个线程不够用的情况下,也可以修改相应的默认配置去增加默认的线程数(一般不需要)
  • 解决了CPU开销和线程同步的开销的一些问题

    缺点
  • 处理CPU密集型任务时,他就会过多的占用CPU,后面的逻辑就必须等待了

  • 单线程也无法体现多核CPU的优势,(Nodejs后续的版本给出了解决方案)
  • 比如:集群
    libuv库和阻塞情况代码
    libuv库.png ```javascript // 自定义函数耗时行为 const http = require(‘http’)

// 耗时任务 sleepTime(4)

function sleepTime(time) { const sleep = Date.now() + time * 1000 // 先拿到未来的时间,利用死循环消耗 while (Date.now() < sleep) {} return }

const server = http.createServer((req, res) => { res.end(‘send,starting….’) })

server.listen(8080, () => { console.log(‘服务启动了’); })

// 单线程面对耗时事件

// nodejs 主线程是单线程的(V8只有一个主线程执行代码)

/* 优点:

提高吞吐量,操作数据库提供api服务

实时的聊天程序

Nodejs更加适合IO密集型任务 高并发请求

Nodejs做中间层

不适合:处理大量的业务逻辑 */

```

应用场景

Nodejs更加适合IO密集型高并发请求(不适合处理大量的业务逻辑)

Nodejs做中间层(BFF层)

操作数据库提供API服务

实时聊天应用程序

中间层.png