?
前言:本节主要是Nodejs的初步应用
?
Model1:Nodejs:单进程
? ? ? ?Nodejs是单进程的,同一时期是只有一个进程执行Nodejs代码,单进程模式约束了我们在写JavaScript代码必须要使用非阻塞、异步的方式。
?
Model2:阻塞与非阻塞的区别
Demo案例:
?
var http = require('http') http.createServer(function(req,res){ var url = req.url console.log("Current url : " + url) res.writeHead("200",{"content-type":"text/html"}) res.write("Hello World") res.end() }).listen(8888,function(){ console.log("The server is start to : 8888") }) console.log("欢迎来到Nodejs世界。")
?
输出结果:
? ? ? ?E:\NodejsWorkSpace>node Demo1.js
? ? ? ?欢迎来到Nodejs世界
? ? ? ?The server is start to : 8888
?
解析:
? ? ? ?输出顺序:
? ? ? ?因为Nodejs是采用异步回调的方式,listen执行时机是在请求结果返回后在执行。
?
?
插曲:
? ? ? ? 为了避免重复的重启cmd窗口,需要开启监听进程:
? ? ? ? cmd->npm install supervisor -g
? ? ? ? cmd->supervisor -h ? 如果显示帮助文档即为安装成功
? ? ? ? 使用监听:
? ? ? ? cmd->supervisor Demo1.js
? ? ? ? 输出日志信息:
? ? ? ? DEBUG: Starting child process with 'node Demo1.js'
? ? ? ? 为node Demo1.js开启一个子进程(用于执行)
? ? ? ? DEBUG: Watching directory 'E:\NodejsWorkSpace' for changes.
? ? ? ? 监视目录文件是否改变(如果文件内容改变,则卸载子进程,重新开启)
?
? ? ? ? 当内容改变时,cmd窗口会自动输出更改后的信息
?
Demo改动:
var http = require('http'), //插入标点 sleep = function(milliSecond){ //插入函数 var start = new Date().getTime() + milliSecond while(new Date().getTime() < start){} } http.createServer(function(req,res){ var url = req.url sleep(5000) 插入 ...
?现象:
? ? ? ? 在两个浏览器同时请求http://localhost:8888/时,后刷新的会延迟加载5秒。
解析:
? ? ? ?这就模拟了同步的现象,sleep相当于同步的函数。而Nodejs推荐使用异步。
?
Model3:多线程模型和事件驱动模型区别:
? ? ? ?1、传统的IIS和Apache服务器是多线程模型,当服务器开启后,等待客户端的请求,当收到链接请求后会开启一个线程从头到尾服务该请求。如果处理该请求当中涉及访问外部数据源(数据库、文件)等耗时操作,会导致请求会被阻塞,被称为阻塞式IO。当链接越来越多的时候,将会导致服务延时,甚至崩溃。因为每个请求就要开启一个线程,如果想要提高服务器性能,就要同时处理多个线程。假设每个线程2M,10个就是20M。以及本身线程延时,使多个线程重叠处理。而无休止的增长,会使大量的线程重叠处理。
? ? ? ?2、时间驱动模型:当WebServer接收到请求,将请求分发给相应的线程做处理。主线程会继续接收和服务下一个请求。当之前的请求完成后,它会被放入到一个待处理的列表(处理完成,待主线程调用的队列),当请求到达队列头的时候,主线程会调用当初注册的回调函数,并且把结果返回给客户端。
?
Model4:异步回调代码维护问题:
?
Model5:Promise/A+规范的Deferred库:
? ? ? ? 在jQuery1.7版本中即增加了延迟对象(Deffered object)。这个就是Promise/A+规范的Deferred库。
例子:
? ? ? ?$.get("test.php")