Node.js进阶之路 - (EPUB全文下载)
文件大小:0.63 mb。
文件格式:epub 格式。
书籍内容:
Node.js进阶之路
第1章 Node异步编程范式
第2章 搭建自己的开发环境
第3章 使用Docker部署Node服务
第4章 Node模块
第5章 V8引擎
第6章 Promise对象
第7章 用ES6 Generator解决回调金字塔
第8章 LoopBack开源框架
第9章 编写C++扩展
附录
第1章 Node异步编程范式
本章通过实际案例,向读者介绍Node异步编程的优势和原理,这些内容帮助读者理解Node运行的本质。本章还就Node实现异步调用的两种机制进行详细的介绍,并引用源码,剖析其内部实现的流程。
1.1 同步与异步的比较
Node是一个JavaScript运行时环境,它为JavaScript提供了一个异步I/O编程框架,较其他语言通常使用的同步式方案,其性能好比“搭载上了火箭”。Node的指导思想说起来也简单——CPU执行指令是非常快速的,但I/O操作相对而言是极其缓慢的。可以说,Node要解决的也是这类问题,即给CPU执行的算法容易,I/O请求却频繁的情况。
请求到了,相对于传统的进程或者线程同步处理的方式,Node只在主线程中处理请求。如果遇到I/O操作,则以异步方式发起调用,主线程立即返回,继续处理之后的任务。由于异步,一次客户请求的处理方式由流式变为阶段式。我们使用Node编写的JavaScript代码都运行在主线程。
假设一次客户请求分为三个阶段——执行函数a,一次I/O操作,执行函数b。如图1-1代表了同步式的处理流程。
图1-1 同步式的处理流程
可以用一段伪代码描述同步请求的过程,如下所示:
//代码1-1
function request() {
//开始执行函数a
$rel_a = stage_a();
//读文件,将文件内容返回到$data
$data = readfile();
//将前两步的结果作为参数,调用函数b
stage_b($rel_a, &data);
}
可见,同步式处理方式中,每个请求用一个线程(或进程)处理。一次请求处理完毕之后,线程被回收。同步式的方式只画出了两个线程,如果有更多客户请求,线程数还要增加。与之相比较,如图1-2所示则是Node异步执行的示意图。可见,Node一个主线程解决了所有的问题。这种异步式处理流程中,每一个方块代表了一个阶段任务的执行。
图1-2 Node异步执行示意图
对比同步,异步同样可以用一段伪代码表达Node异步的处理方式,如下所示:
//代码1-2
var request = function(){
//开始执行函数a
var rel_a = stage_a();
//发起异步读取,主线程立即返回,处理之后的任务
readfileAsync(function(data){
//在随后的循环中,执行回调函数
stage_b(rel_a, data);
});
}
Node也“站在巨人的肩上”。这个“巨人”是大名鼎鼎的V8引擎,有这样一个强大的“心脏”,再配合基于高阶函数和闭包的异步编码范式,使得用Node构建的程序在性能上有着出色的表现。
小知识
高阶函数与闭包是两个联系非常紧密的概念。如果一个函数以一个或多个函数作为参数,或者返回一个函数,那么称此函数为高级函数。Node中大部分的异步函数,参数列表的最后一项接受一个回调,这类异步函数就符合高阶函数的定义。高阶函数执行后返回的函数,或者接受的函数参数,则被称为闭包。闭包的最大特点是引用了它之外的变量,这些变量既不是全局的,也不是参数和局部的,而是作为闭包执行时的上下文环境存在。如下所示:
//代码1-3
function wrapper(price){
var freeVal = price;
function closure (delta){
return freeVal * delta;
}
return closure;
}
var clo1 = wrapper(100);
var clo2 = wrapper(200);
setTimeout(function(){
console.log(clo1(1));
console.log(clo2(1));
}, 500);
代码1-3运行后输出的结果如下:
100
200
函数wrapper是一个高阶函数,执行后返回一个闭包,这个闭包将price纳入自己的作用域,price就不再是函数内部的局部变量,它有一个名字叫自由变量,其生命期与闭包绑定。price这样的自由变量被闭包内的代码引用,成为闭包执行的上下文。
Node高性能的来源,得益于它异步的运行方式。可以举一个例子来理解异步对性能的提升。按照目前北京出入车辆管理规定,外地来的车需要办理进京证,而办进京证需等待一定时间。如果每个人都自己跑去办理,就好比开启多个线程同步处理,办理窗口有限,就得排队。而把这件事委托给第三方,就好比不开启线程或进程,把耗时的I/O请求委托给操作系统。这种情况下人们从办证的任务中解放出来,因而能继续做其他事情。若来了一个任务,交给第三方去处理,则第三方就有一个接单队列,其只需拿着所有的接单,去办理地点逐个办理即可。
如图1-3所示是办理进京证的示意图。假设有20个人,每人开车来回花费2小时,往返油费60元,办理窗口有两个,在窗口办完一个进京证平均需要5分钟。不考虑排队时间,则20个人办证花费的总时间至少是20×2+20×5÷60小时,总油费是20×60元。按照目前北京市最低工资标准推断,假设有车族时薪为100元,则总成本为(20×2+20×5÷60)×100+20×60元,这个数字大概是5367元。下面来对比一下异步办理进京证的花费。
图1-3 同步办理进京证示意图
客户将资料交给代理者,此人拿着20个客户的资料,一个人办理完所有事情。同样假设此代理者的时薪为100元,则总花费为(20×5÷60)×100+60元,这个数字大概 ............
以上为书籍内容预览,如需阅读全文内容请下载EPUB源文件,祝您阅读愉快。
书云 Open E-Library » Node.js进阶之路 - (EPUB全文下载)