node.js是JavaScript的运行环境,或者说是web开发的runtime。
总的介绍
- 事件驱动
- 非阻塞I/O
- 基于Chrome V8引擎
- 单线程
- 使用 JavaScript 开发后端代码
优点
- 事件驱动
- 非阻塞I/O
- 前端开发工程师偏爱
Node适合干什么
适合I/O密集场景
CPU 密集和 I/O密集的区别
- CPU密集:压缩、解压、加密、解密
- I/O密集:文件操作、网络操作、数据库
I/O密集场景有哪些
- 文件操作
- 网络操作
- 数据库
为什么非常适合Web
因为web常见场景基本都是I/O密集场景
- 静态资源读取
- 数据库操作
- 渲染页面
非阻塞I/O
当执行I/O操作时,计算机会调用底层的命令来执行I/O操作,期间程序【cpu】就会等待底层命令返回结果,拿到结果后,才能执行下一条指令。
- I/O时函数立即返回,进程不等待IO完成。
- I/O会继续进行下一步操作,等I/O完成了,会通知主进程,我I/O完事了,这时主进程会决定是否采用或者遗弃。
阻塞I/O
I/O时进程休眠,等待IO完成后进行下一步,也就是I/O阻塞了进程。
事件驱动和非阻塞I/O的联系
怎么告诉主程序I/O完事了,这就要靠事件驱动。
什么是事件驱动
- I/O等异步操作结束后的通知
- 观察者模式
I/O完成后,emit一个事件,然后会去找这个事件所绑定的函数,找到后,会执行这个函数。
为什么I/O要说成非阻塞的?
其实计算机指令的执行,除了goto语句等,都是按照顺序执行的,也就是同步,但是cpu指令执行的速度大致为一秒30亿次,非常快,我们感觉不到阻塞,但是I/O操作是非常慢的,如果用同步的,就能感觉到阻塞。
矛与盾
其实构建工具如webpack等,是属于cpu密集场景,因为需要打包、编译等操作。用node.js并不好,但是由于node.js应用是用JavaScript开发的,和对应的前端的ide很多,所以综合考虑,node.js是最佳运行环境。
node.js在公司中的使用场景
- web Server
- 本地代码构建
前端写的代码不能直接在浏览器上运行,就需要转化和编译,这就需要用到构建。
- 实用工具开发
关于node单线程的问题
单线程只是针对主进程,I/O操作会进行系统底层多线程调度,node.js只是发起一个请求,交给I/O,I/O调用操作系统底层命令,底层是多线程调度,来达到最佳性能,node.js不是做所有的事情, 它只是负责听,将请求给I/O,I/O完成后告诉node.js。node.js再去执行其他方法。
node.js只有一个主进程,一个进程里只有一个单线程,多线程调度是底层操作系统干的事情。
单线程并不是单进程。node有个class,cpu有八核,那么调用class就可以有八个进程,可以满足更高的并发。