众所周知,nodeJs可以高性能的搭建网站,但是为什么nodeJs的性能特别高呢?
因为Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。而且NodeJs的所有API都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。(nodeJs的事件采用的是设计模式中观察者模式)
事件驱动程序
为某个事件注册了回调,当事件发生时执行回调函数,这就是事件驱动。这种回调的方式就可以不阻塞io,从而达到高性能的目的。
这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)
在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。
EventEmitter
Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列。
Node.js里面的许多对象都会分发事件:一个net.Server对象会在每次有新连接时分发一个事件, 一个fs.readStream对象会在文件被打开的时候发出一个事件。 所有这些产生事件的对象都是 events.EventEmitter 的实例。
EventEmitter 的核心就是事件触发与事件监听器功能的封装。
EventEmitter默认情况下最多可绑定十个事件。
下面一个event.js的示例:
var EventEmitter = require('events').EventEmitter;
var life = new EventEmitter();
life.setMaxListeners(11);
//addEventListener
function sleep(who){
console.log(who + ' is sleepping');
}
life.on('life', sleep);
life.on('life', function(who) {
console.log(who + ' is writing');
})
life.on('life', function(who) {
console.log(who + ' is working');
})
life.on('life', function(who) {
console.log(who + ' is coding');
})
life.on('life', function(who) {
console.log(who + ' is running');
})
life.on('life', function(who) {
console.log(who + ' is reading');
})
life.on('life', function(who) {
console.log(who + ' is playing');
})
life.on('life', function(who) {
console.log(who + ' is eatting');
})
life.on('life', function(who) {
console.log(who + ' is drinking');
})
life.on('life', function(who) {
console.log(who + ' is hunging');
})
life.on('anotherlife', function(who) {
console.log(who + ' is anotherlife one');
})
life.on('anotherlife', function(who) {
console.log(who + ' is anotherlife two');
})
//移除事件
life.removeListener('life',sleep);
//查看有多少事件
console.log(life.listeners().length);
console.log(EventEmitter.listenerCount(life,'life'));
//批量移除
life.removeAllListener('life');
//判断事件是否被监听过
var hasLifeListener = life.emit('life','Jocelyn');
控制台的输出如下:
0
9