Node.js系列——(4)优势及场景
背景
之前几篇系列文章简单介绍了node.js的安装配置及基本操作:
Node.js系列——(1)安装配置与基本使用
Node.js系列——(2)发起get/post请求
Node.js系列——(3)连接DB
接下来,我们就来整体认识下node.js
node.js
node.js官网对它的介绍是这样的:
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
V8引擎
V8使用C++开发,并在谷歌浏览器中使用。在运行JavaScript之前,相比其它的JavaScript的引擎转换成字节码或解释执行,V8将其编译成原生机器码(IA-32, x86-64, ARM, or MIPS CPUs),并且使用了如内联缓存(inline caching)等方法来提高性能。
有了这些功能,JavaScript程序在V8引擎下的运行速度媲美二进制程序。
具体内容可参考:为什么V8引擎这么快?
事件驱动
传统技术实现下,当一个请求到达时,会分配一个线程,该线程会占用内存,当请求的任务做完时,线程才会退出并释放内存。但node.js只有一个单线程,所有的连接都由这一个线程来处理。
网上流传着一个生动的例子:
传统技术下的处理方式——>餐馆里一个服务员接待一桌客人,服务这一桌客人点餐、上菜、陪侍,到客人离开;
node.js的处理方式——>餐馆里只有一个服务员,当有客人来,他就去招待点餐,点餐结束后就去处理其他事情,可以去招待其他客人,也可以去上菜。
Node.js是单进程单线程的,那他是如何做到高性能的呢?
主要通过事件驱动和异步回调。node中几乎所有的事件机制都是使用观察者模式实现的。
说到观察者模式,就要先明确主题Subject(即被观察者)和观察者Observer。
如下图所示,在node中事件扮演者Subject的角色,而这个事件上的处理函数就是观察者。还拿上面的餐馆服务员的例子来说,客人进入餐馆这一动作就是一个事件,当这一事件触发时,他的观察者就会进行一系列操作(比如招待入座、点餐等)。
由于node是单线程的,因此在实际场景中会有很多事件堆积到一起,这也就是事件队列。
在上图中所示:
1) 如果有任务或请求到达,会被放入右侧的Event Queue(事件队列)中。事件队列中每个任务会存放两个东西,处理方法和回调方法,即function和callback。
2)事件循环Event Loop会根据事件队列中的任务列表进行执行,这时分两种情况:
- 如果取到的任务是non-Blocking非阻塞的,那么可以直接执行然后调用他相对应的回调函数。
- 如果任务是Blocking阻塞的(如IO操作等),就不会直接执行,而是从线程池Thread Pool中取出一个线程来执行,当该线程完成后,就会调用回调函数,接下来的操作跟上一种情况一样了。到最后该线程的任务执行完毕,那么线程所占用的资源被释放。
Tips:
当执行过程中遇到I/O阻塞(读取文件、查询数据库、请求套接字、访问远程服务等)时,事件循环线程不会停下等待结果,转而继续执行队列中的下一个任务,不会在事件循环线程中执行。在函数执行时,Node.js在事件队列中放置回调函数,它的顺序根据函数的完成快慢决定。
具体内容参考:Node.js的事件驱动模型
Rest API
Rest API 这部分就不用多说了,node采用这种方式来规范接口和数据的形式,用法也很简单。
场景
前面说了这么多node.js的优点,那是不是任何场景都优先选择他呢?肯定不是的,我们来看下他的缺点。
1、node.js不适合做CPU密集型的工作
我们不能说node.js完全是单线程的,因为当遇到阻塞式的任务时,他会交给其他线程去处理。但除此之外,node是单线程的。因此,如果是CPU密集的场景下,选择使用node,无法使他的优势发挥出来。
2、大量的计算可能会使node单线程暂时失去反应
3、如果有一个Exception影响到了node的核心事件循环,那么整个实例就会崩溃。
Node.js系列——(4)优势及场景的更多相关文章
- node.js系列笔记之node.js初识《一》
node.js系列笔记之node.js初识<一> 一:环境说明 1.1 Linux系统CentOS 5.8 1.2 nodejs v0.10.15 1.3 nodejs源码下载地址 htt ...
- Node.js系列-http
前言: 最近一直忙着公司项目的事,战友们的留言也没空回复,博客也有段时间没有更新了,年底了就是一个的忙啊~~~(ps:同感的也给个赞吧) 现在前端的就是一直地更新一直有新的东西出来,什么ES2015, ...
- Node.js系列-express(上)
前言 Node.js系列的第一篇:http,大概描述了通过使用node.js内置的api创建一个服务并监听request实现简单的增删改查.现在,我们就通过通读express官网及使用express框 ...
- 《唐三学node.js系列》—魂士篇&&三哥初始node.js
前言 如果你有一定的前端基础,比如 HTML.CSS.JavaScript.jQuery.那么Node.js 能让你以最低的成本快速过渡成为一个全栈工程师(我称这个全栈为伪全栈,我认为的全栈也要精通数 ...
- Node.js系列——(3)连接DB
背景 node.js,有人称之为运行在服务器端的JavaScript.以往我们使用JavaScript时,都是依赖后端查询数据库并返回数据,而JavaScript只需要展示即可.问题来了,就不能绕开后 ...
- Node.js介绍、优势、用途
一.Node.js介绍Node.js是一个javascript运行环境.它让javascript可以开发后端程序,实现几乎其他后端语言实现的所有功能,可以与PHP.Java.Python..NET.R ...
- Node.js系列之node.js初探
官方介绍:Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable n ...
- Node.js系列基础学习-----回调函数,异步
Node.js基础学习 Node.js回调函数 Node.js异步编程的直接体现就是回调,异步编程依托回调来实现,但不是异步.回调函数在完成任务后就会被调用,Node有很多的回调函数,其所有的API都 ...
- Node.js系列基础学习----安装,实现Hello World, REPL
Node.js基础学习 简介 简单的说 Node.js 就是运行在服务端的 JavaScript.Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台.Node.js是一 ...
随机推荐
- Python3 break与continue
Infi-chu: http://www.cnblogs.com/Infi-chu/ break和continue都是中断循环的意思,但是他们的中断后的效果不同. 请看如下两个例子就懂了 ''' 这个 ...
- opencv+python视频实时质心显示
利用opencv+python实现以下功能: 1)获取实时视频,分解帧频: 2)将视频做二值化处理: 3) 将视频做滤波处理(去除噪点,获取准确轮廓个数): 4)识别图像轮廓: 5)计算质心: 6)描 ...
- 自己第一次使用ANTLR遇到的问题
觉得既然是第一次尝试ANTLR嘛,那就来个简单点的,parse Windows 的 hosts 文件吧,结果...... 先上一段 grammar: grammar hosts; hostfile: ...
- 20155334 实验五 Java网络编程及安全
20155334 实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 实验1: 参考 结对实现中缀表达式转后缀表达式 ...
- # 2017-2018-1 20155336《信息安全技术》实验二——Windows口令破解
2017-2018-1 20155336<信息安全技术>实验二——Windows口令破解 实验原理 口令破解方法 口令破解主要有两种方法:字典破解和暴力破解. 字典破解是指通过破解者对管理 ...
- RHCSA-day1
1. 破解密码 开机 e 进入编辑模式 linux16 /boot/.............................en_US.UTF_8 这行末尾插入 rd.break (空格) ctrl ...
- 【洛谷P4556】 雨天的尾巴
题面 题解 线段树合并 我们看到这道题目首先可以想到树上差分,然后\(dfs\)合并 发现题目让我们求的东西很好用线段树维护 于是可以想到线段树合并 全世界只有我写指针版动态开点线段树(大雾 如果你要 ...
- 洛谷P2464 [SDOJ2008]郁闷的小J
洛谷P2464 [SDOJ2008]郁闷的小J 题目描述 小J是国家图书馆的一位图书管理员,他的工作是管理一个巨大的书架.虽然他很能吃苦耐劳,但是由于这个书架十分巨大,所以他的工作效率总是很低,以致他 ...
- HBase第二章 基本API
1.pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www ...
- Maven学习(六)-----Maven仓库的详细介绍
Maven仓库的详细介绍 在Maven中,任何一个依赖.插件或者项目构建的输出,都可以称之为构件.Maven在某个统一的位置存储所有项目的共享的构件,这个统一的位置,我们就称之为仓库.(仓库就是存放依 ...