- 异步IO、事件驱动、 事件循环
- Nodejs是使用JS实现高效可伸缩的高性能web服务
-
单线程如何实现高并发?
异步非阻塞IO配合事件回调通知
程序代码当中,如果存在多个请求是无须阻塞的,会从上向下执行,然后会等待着libuv库完成工作之后,按照顺序通知相应的事件回调触发执行(这样单线程完成了单线程的工作)
Nodejs主线程是单线程的
单线程的优点
因为Nodejs代码最终是由V8执行的,而在V8当中只有一个主线程来执行的我们的js代码(所以是平常所说的单线程)
- libuv库当中存在线程池的(右边)
- 请求分为:网络IO,非网络IO,以及非IO的异步操作
- 网络IO,libuv库会调用当前平台的相对应的平台接口,进行处理
- 另外两种IO会使用线程池当中的线程去处理
- 如果这四个线程不够用的情况下,也可以修改相应的默认配置去增加默认的线程数(一般不需要)
-
缺点
处理CPU密集型任务时,他就会过多的占用CPU,后面的逻辑就必须等待了
- 单线程也无法体现多核CPU的优势,(Nodejs后续的版本给出了解决方案)
- 比如:集群
libuv库和阻塞情况代码
```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做中间层
不适合:处理大量的业务逻辑 */