培育能力的事必须继续不断地去做,又必须随时改善学习方法,提高学习效率,才会成功。 —— 叶圣陶
一、我们为什么要使用node,它的好处是什么?
Node的首要目标是提供一种简单的,用于创建高性能服务器的开发工具。还要解决web服务器高并发的用户请求。
解决高并发?
我们这里来举个例子,我们node和java相比,在同样的请求下谁更占优一点。看图
- 当用户请求量增高时,node相对于java有更好的处理
并发
性能,它可以快速通过主线程绑定事件。java每次都要创建一个线程,虽然java现在有个线程池
的概念,可以控制线程的复用和数量。 - 异步i/o操作,node可以更快的操作数据库。java访问数据库会遇到一个并行的问题,需要添加一个锁的概念。我们这里可以打个比方,下课去饮水机接水喝,java是一下子有喝多人去接水喝,需要等待,node是每次都只去一个人接水喝。
- 密集型CPU运算指的是逻辑处理运算、压缩、解压、加密、解密,node遇到CPU密集型运算时会阻塞主线程
(单线程)
,导致其下面的时间无法快速绑定,所以node不适用于大型密集型CPU运算案例
,而java却很适合。
node在web端场景?
web端场景主要是用户的请求
或者读取静态资源
什么的,很适合node开发。应用场景主要有聊天服务器
,电子商务网站
等等这些高并发的应用。
二、node是什么?
Node.js是一个基于 Chrome V8 引擎的JavaScript运行环境(runtime)
,Node不是一门语言,是让js运行在后端的运行时
,并且不包括javascript全集,因为在服务端中不包含DOM
和BOM
,Node也提供了一些新的模块例如http,fs
模块等。Node.js 使用了事件驱动、非阻塞式 I/O
的模型,使其轻量又高效并且Node.js 的包管理器 npm
,是全球最大的开源库生态系统。
总而言之,言而总之,它只是一个运行时,一个运行环境。
node特性
- 主线程是单线程(异步),将后续的逻辑写成函数,传入到当前执行的函数中,当执行的函数得到了结果后,执行传入的函数
(回调函数)
。 - 五个人同时吃一碗饭(异步)。
- 阻塞不能异步(现在假定数据库是厨师,服务员是node,顾客是请求,一般是厨师做菜让一个服务员递给多个用户,如果厨师邀请服务员聊天,就会导致阻塞,并且是针对内核说的)。
- i/o操作,读写操作,异步读写(能用异步绝不用同步)
非阻塞式i/o
,即可以异步读写。 - event-driven
事件驱动
(发布订阅)。
node的进程与线程
进程
是操作系统分配资源和调度任务的基本单位,线程
是建立在进程上的一次程序运行单位,一个进程上可以有多个线程。
在此之前我们先来看看浏览器的进程机制
自上而下,分别是:
- 用户界面–包括地址栏、书签菜单等
- 浏览器引擎–用户界面和渲染引擎之间的传送指令(浏览器的主进程)
- 渲染引擎–浏览器的内核,如(webkit,Gecko)
- 其他–网络请求,js线程和ui线程
从我们的角度来看,我们更关心的是浏览器的
渲染引擎
,让我们往下看。
渲染引擎
- 渲染引擎是
多线程
的,包含ui线程和js线程。ui线程和js线程会互斥,因为js线程的运行结果会影响ui线程,ui更新会被保存在队列&#