Nodejs区别于传统应用的特点: 1. 异步事件驱动 2. 非堵塞I/O 3. 单线程(这里指主线程) 4. 性能出众 接下来就对以上4点进行简单的阐述: 一、事件驱动
首先,解释下“事件驱动”这个概念。所谓事件驱动,是指在持续事务管理过程中,进行决策的一种策略,即跟随当前时间点上出现的事件,调动可用资源,执行相关任务,使不断出现的问题得以解决,防止事务堆积。 Nodejs设计思想中以事件驱动为核心,事件驱动在于异步回调,他提供的大多数api都是基于事件的、异步的风格。而事件驱动的优势在于充分利用系统资源,执行代码无须阻塞等待某种操作完成,有限的资源用于其他任务。事件驱动机制是通过内部单线程高效率地维护事件循环队列来实现的,没有多线程的资源占用和上下文的切换。 二、异步、非堵塞I/O
Nodejs提供的很多模块中都是异步执行的。比如,文件操作的函数。 一个异步I/O的大致流程: 1. 发起I/O调用 ①用户通过js代码调用nodejs的核心模块,将回调函数和参数传入核心模块 ②将回调函数和参数封装成 2. 执行回调 ①操作完成将结果储存到请求对象的result属性上,并发出完成通知。 ②循环事件,如果有未完成的,就在进入对象请求I/O观察者队列,之后当做事件处理;
三、单线程 Nodejs跟Nginx一样都是单线程为基础的,这里的单线程指主线程为单线程,所有的阻塞的全部放入一个线程池中,然后主线程通过队列的方式跟线程池来协作。我们写js部分不需要关心线程的问题,简单了解就可以了,主要由一堆callback回调构成的,然后主线程在循环过在适当场合调用。
四、性能出众 底层选择用c++和v8来实现的,上面第一点讲到过,nodejs的事件驱动机制,这意味着面对大规模的http请求,nodejs是凭借事件驱动来完成的,性能部分是不用担心的,并且很出色。
Nodejs应用场景: 适合I/O密集型的应用,如在线多人聊天,多人在线小游戏,实时新闻,博客,微博之类的。 不适合的场景有:cpu密集型的应用,如计算圆周率,视频解码等业务场景较多的。
|