简介

Node.js 专注于实现 web 高性能的服务器,是一个让 JavaScript 运行在服务器上的平台。他使用 Chrome 浏览器的 V8 引擎作为 JS 代码的解释工具,底层使用 C++ 进行开发,而 V8 引擎也正是基于 C++ 开发的。

Node.js 并不是一种新的语言,他是基于 JavaScript 实现的,但是他让 JavaScript 焕发出了新的活力,将 JavaScript 的触角伸到了服务器端。

Node.js 和传统的服务器端程序的最大区别在于 Node.js 没有 Web 容器的概念。一般来服务器程序比如 PHP、JSP、Python、Perl、Ruby 等都需要运行在 Web 容器中才能被访问,最常用的 Web 容器比如说 Apache、Nginx 等。但是 Node.js 没有!通过对于顶层路由的设计能够制定出很简洁清晰的 URL。

特点一:单线程

Node.js 的另一大特点在于他是单线程的,整个 Node.js 程序运行在单一的一个线程上。

一个 Java Web 项目,用户发起请求会为其创建一个线程,而每一线程都需要占用一定的内存,所有对于服务器的要求会随着用户数的增加而增加,硬件成本也相应提高。同时使用多线程会存在上下文切换和线程销毁的开销,如果使用单线程就能避免这些应为多线程带来的系统开销,提高系统运行效率。

Node.js 不会为每个用户创建一个新的线程,而是使用同一个线程接收所有的请求。使用一个线程在面对多个用户请求时,Node 不能像多线程那样并行地对其进行处理。在单线程上我们顺次执行程序,在一个请求没有执行完的时候,线程就会阻塞,下一个请求就无法进行。

特点二:非阻塞式 IO

为了应付单线程的阻塞问题,Node 使用了非阻塞 I/O 机制。

处理一个请求时最耗时的操作是各种 I/O 操作,最频繁的就是对数据库的读写操作,或者是对文件的读写操作。在单线程中如果执行到 I/O 操作,则线程会在此阻塞等待返回结果。

Node 为了应付费时的 I/O 操作使用了非阻塞 I/O 模式。当程序一旦执行到了 I/O 操作的部分,则立即将 I/O 操作交给回调函数,自己则继续执行后面的程序。

这里就有两点需要注意的。

一是执行回调函数之后的代码不能依赖回调函数的结果。比如用户登录的操作,需要查询数据库验进行校验,之后的登录操作需要依赖回调的结果,此时必须等待返回校验结果才能进行登录操作。

二是执行回调函数之后何时再继续执行。所以必须要有事件循环,回过头来继续执行操作,就需要不断检查线程上有没有没有处理完的事件,排队实现他们。

因此 Node 的这条线程一直处于运行状态不会阻塞,CPU 的利用率一直很高。

特点三:事件驱动

Node 的第三个特点就是事件驱动。也就是前面讲的在线程执行 A 操作的过程中采用回调函数的形式转而处理 B 事件,在 B 事件处理完之后再去执行 B,如网上一张图片所示:

图片描述

事件在循环执行之中,当遇到 I/O 操作则采用回调函数处理,处理完的事件则会排队等候再次执行,形成了一个个的事件环

Node 通过非阻塞 I/O 的机制和事件驱动的方式让单线程的程序实现了多线程的效果。让一个线程永远处于忙碌的状态,不会造成资源的浪费。这样就能降低硬件的成本却不会影响程序执行的效率。


深页
105 声望3 粉丝