当前位置: 首页 > 后端技术 > Node.js

Node.js的介绍

时间:2023-04-03 20:03:00 Node.js

第一次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程序运行在一个线程上。对于JavaWeb项目,当用户发起请求时,会为其创建一个线程,每个线程都需要占用一定的内存。所有对服务器的要求都会随着用户数量的增加而增加,硬件成本也会相应增加。同时使用多个线程会有上下文切换和线程销毁的开销。如果使用单线程,就可以避免这些本应由多线程引起的系统开销,提高系统的运行效率。Node.js不会为每个用户创建一个新的线程,而是使用同一个线程来接收所有的请求。当使用一个线程面对多个用户请求时,Node无法像多线程那样并行处理。在单个线程上,我们按顺序执行程序。当一个请求没有被执行时,线程就会被阻塞,无法处理下一个请求。特点二:非阻塞IO为了处理单线程阻塞问题,Node采用了非阻塞IO机制。处理请求时最耗时的操作是各种I/O操作,最频繁的是对数据库的读写操作,或者是对文件的读写操作。如果在单线程中进行I/O操作,线程会阻塞在这里等待结果返回。Node在I/O操作到期时使用非阻塞I/O模型。一旦程序执行到I/O操作的部分,I/O操作会立即交给回调函数,后面的程序继续自己执行。这里有两点需要注意。一是执行回调函数后的代码不能依赖于回调函数的结果。比如用户登录操作需要查询数据库验证,后续的登录操作需要依赖回调的结果。此时登录操作必须等待验证结果返回。二是执行完回调函数什么时候继续执行。所以必须要有一个事件循环,当你回去继续执行操作的时候,需要不断的检查线程上是否还有未处理的事件,并排队执行。所以Node的这个线程一直在运行,不会阻塞,CPU利用率一直很高。特性三:事件驱动Node的第三个特性是事件驱动。也就是说,在执行A操作的过程中,线程使用回调函数的形式处理B事件,然后在B事件处理完毕后执行B,如网上的一张图所示:event是循环执行的,当遇到I/O操作时,通过回调函数进行处理,处理完的event会再次排队执行,一个一个的形成一个事件循环。Node通过非阻塞I/O机制和事件驱动的方式使单线程程序达到多线程的效果。让一个线程永远处于忙碌状态不会造成资源浪费。这样可以在不影响程序执行效率的情况下降低硬件成本。