Node的特点
目录
警告
本文最后更新于 2022-09-20,文中内容可能已过时。
特点
- 事件驱动
- 非阻塞 I/O
- 单线程
- 跨平台
IO
I/O 任务主要由 CPU 分发给 DMA 执行,I/O 是一个相对耗时较长的工作,大部分时间是在等待。
脚本语言更适合 IO 密集型的任务,node 是其中的佼佼者。
事件驱动
PHP 应用,任何时候当有请求进入的时候,网页服务器(通常是 Apache)就为这一请求新建一个进程,并且开始从头到尾执行相应的 PHP 脚本。而我们的 node 是单线程的。
http.createServer(callback).listen(port)
,当一个请求到达端口的时候,callback 就会被执行。这个就是传说中的 回调 。我们给某个方法传递了一个函数,这个方法在有相应事件发生时调用这个函数来进行 回调 。
这依赖于 node 的 事件循环。
单线程
node 采用单线程,异步非阻塞模式。
JavaScript 是单线程,但 JavaScript 的 runtime Node.js 并不是,负责 Event Loop 的 libuv 用 C 和 C++ 编写
- 优点
- 不用像多线程那样在意状态同步的问题,没有死锁现象,没有线程上下文切换所带来的性能上的开销
- 缺点
- 无法利用多核 cpu
- 错误会引起整个应用退出
- 大量计算占用 cpu 导致无法继续调用异步 I/O
解决方案:1. 编写 C/C++拓展来更高效的利用 CPU,2. 利用子进程(child_process),将计算分发到各个子进程,再通过进程之间的事件消息来传递结果,将计算与 I/O 分离。
如上方 PHP 应用,采用多线程来处理高并发,一个请求就开个新线程,处理完成后再释放。
用户请求来了, CPU 的部分做完不用等待 I/O,交给底层完成,然后可以接着处理下一个请求了,快就快在
- 非阻塞 I/O
- Web 场景 I/O 密集
- 没多线程 Context 切换开销,多出来的开销是维护 EventLoop
跨平台
Node 一开始只能在 linux 上执行,后来基于 libuv
实现了跨平台。
操作系统和 Node 上层模块系统之间构建了一层平台架构层,即 libuv
。