1.什么是Node.js?
- Node.js不是JS应用,不是语言,也不是框架,只是JS的运行环境
- 事件驱动,非阻塞I/O,简单说就是每个函数都是异步的,Node.js内部隐藏了非阻塞I/O的具体细节,使得我们可以轻松编写高性能的WEB应用,所以它是轻量且高效的
- 使用npm作为包管理器
2.基本原理
下图为Node.js早期的架构图。此图简要介绍了Node.js 是基于Chrome V8引擎构建的,由事件循环(Event Loop) 分发I/O任务,最终工作线程(Work Thread) 将任务丢到线程池(Thread Pool)里去执行,而事件循环只需要等待执行结果就可以了。
梳理思路:
- Chrome V8是JavaScript引擎
- Node.js内置Chrome V8引擎,故而Node.js使用JavaScript语法
- JavaScript语言最大的特点就是单线程,也就意味着同时只能做一件事——“专一”
- 单线程就意味着所有任务需要排队,前一个任务结束才能执行后一个任务,如果前一个任务耗时很长,后一个任务就只能在那傻等着
- 排队有两种情况导致:1)因为计算量大,CPU忙不过来——情有可原
- 2)CPU闲着,因为I/O很慢,不得不等着出结果出来了再往下执行——浪费青春
- 将等待中的I/O任务放到事件循环(Event Loop)里
- 由事件循环(Event Loop)将I/O任务放到线程池中
- 只要有资源就尽力执行
在解决并发的问题上,异步是最好的解决方案,这就好比是排队和叫号机
- 排队:在排队的时候,什么也干不了只能等
- 叫号机:先取号,等轮到你的时候系统会通知你(Don't call me, I will call you),在这中间,你可以做任何想做的事
对比Node.js 来看:
取号——写代码
叫号机——Event Loop
柜员——线程池(Thread Pool)
说Node.js是单线程是因为接受任务的时候是单线程的,不需要进程/线程切换上下文的成本,很高效。但在执行具体的任务时是多线程的——单接多处