手机版

Node.js事件周期的深入分析

时间:2021-09-20 来源:互联网 编辑:宝哥软件园 浏览:

Node.js是一个单进程单线程的应用程序,但是它通过事件和回调支持并发,所以它的性能非常高。

(它源于Javascript是单线程和异步的,但是这种语言有一个共同的特点:它们是事件驱动的。驱动他们的事件来自一个异构平台。)

Node.js的每个API都是异步的,并且作为独立的线程运行,使用异步函数调用并处理并发性。

基本上,Node.js的所有事件机制都是由设计模式中的观察者模式实现的。

Node.js的单个线程类似地进入while(true)事件循环,直到没有事件观察器退出,并且每个异步事件生成一个事件观察器。如果发生事件,将调用回调函数。

事件驱动模型

Node.js使用事件驱动模型。当web服务器收到请求时,它会关闭请求,然后处理它,然后服务下一个web请求。

当请求完成时,它被放回处理队列,当它到达队列的开头时,结果被返回给用户。

这种模型非常高效且可扩展,因为webserver总是接受请求,而无需等待任何读写操作。(这也称为非阻塞IO或事件驱动IO。)

在事件驱动模型中,生成一个主循环来监听事件,并在检测到事件时触发回调函数。

整个事件驱动过程就是这样实现的,非常简洁。类似于观察者模式,一个事件相当于一个主体,在这个事件上注册的所有处理功能都相当于观察者。

Node.js中有很多内置事件我们可以通过引入events模块和实例化EventEmitter类来绑定和监控事件,如下例所示:

//引入事件模块var events=require(' events ');//创建eventEmitter对象var event emitter=new events . event emitter();//创建事件处理程序var connect handler=function connected(){ console . log('连接成功。);//触发data_received事件event emitter . emit(' data _ received ');}//绑定连接事件处理程序eventemitter.on ('connection ',connect handler);//使用匿名函数绑定data _ received event emitter . on(' data _ received ',函数(){console.log('数据接收成功')。).);});//触发连接事件event emitter . emit(' connection ');Console.log('程序执行完毕。);上述代码输出的结果是:

连接成功。

数据接收成功。

节目结束了。

可以想象,我们可以通过这个事件驱动模型实现异步操作。

(例如,我们可以同时读取文件和执行其他命令。文件被读取后,我们返回文件的内容作为回调函数的参数。这样,在执行代码时就没有阻塞或等待文件I/O操作。这大大提高了Node.js的性能,可以处理大量并发请求。)

var fs=require(' fs ');fs.readFile('input.txt ',函数(err,data){ if(err){ console . log(err . stack);返回;} console . log(data . tostring());});Console.log('程序执行完毕。);上述代码输出的结果是:

节目结束了。

input.txt的内容

从上面的代码可以看出,fs.readFile可以分发事件,当然Node.js中的很多对象都会分发事件,还有一个net。每次有新的连接时,服务器对象都会分发一个事件。所有生成事件的对象都是事件的实例。事件发射器

然而,大多数时候,我们并不直接使用EventEmitter,而是从对象继承它。包括fs、net和http,只要支持事件响应的核心模块是EventEmitter的子类。

你为什么要这么做?原因有二:

首先,具有实体功能的对象按照语义实现事件,事件的监控和发射应该是对象的一种方法。其次,JavaScript的对象机制是基于原型的,支持部分多重继承。继承EventEmitter不会打乱对象原有的继承关系。

让我和大家分享我的第一个NodeJs项目。

安装Node.js通常有两种方法:自己编译源代码和使用编译后的文件。我在这里使用编译后的文件。目前刚在主目录下载了node-v4.2.3-linux-x64。

1.先解压。

复制代码如下:tar xvf节点-v4.2.3-Linux-x64。

2.设置链接,其目的是任何路径都可以使用node命令。

复制代码如下: ln-s/home/node-v 4 . 2 . 3-Linux-x64/bin/node/usr/local/bin/nodeln-s/home/node-v 4 . 2 . 3-Linux-x64/bin/NPM/usr/local/bin/。

3.在主文件夹下创建一个名为mynodeproj的目录,然后创建一个名为server.js的文件(当然,也可以用其他名称命名)。

var http=require(' http ');Http.createserver(函数(请求,响应){//发送Http头//HTTP状态值: 200 : OK //内容类型: text/plain response . write head(200,{ ' content-type ' 3360 ' text/plain ' });//发送响应数据' hello world ' response . end(' hello world \ n ');}).听(8888);//终端打印以下信息console.log('运行于http://127.0.0.1:8888/'的服务器);4.使用node命令执行上述代码。

node server.js

执行上述命令后,命令行上会显示“服务器运行于http://127.0.0.1:888/”,表示程序已经成功执行!

因为我的服务器运行在阿里巴巴云,你在外面的浏览器里输入阿里巴巴云IP端口就可以访问。

版权声明:Node.js事件周期的深入分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。