说到nodejs的事件队列

来源:互联网 发布:mac看不了acfun 编辑:程序博客网 时间:2024/05/21 02:49

  事件队列,将任务按序执行。

  应用场景:最经典的是WEB中的事件编程,如下

<html><body>function event1(){  // do event 1}function event2(){  // do event 2}<button type="button" onclick='event1();event2()'>Click Me!</button></body></html>

在上面的代码中 为button控件的onclick事件绑定了两个任务 event1,event2, 当用户用鼠标点击按钮,就会触发onclick事件,从而按序执行队列中的任务 event1->event2

 在后端编程中,也有事件队列的应用,用来在服务器性能峰值时,有效缓解服务器压力

1. 我们用nodejs的事件机制,解决雪崩问题

     雪崩问题,就是指在缓存失效的情况下,瞬间产生的对数据库的大量并发访问,导致数据库性能下降,进而影响整个网站的性能.

      以下为一段CoffeeScript代码

events =  require('events')eq = new events.EventEmitter //得到一个事件队列的实例queryLock = false //加入一个锁_test = (cb)->  unless queryLock    queryLock = true    sql = 'select id from user'    connect.runSqlAll sql,(err,result)->      cb err,result      queryLock = false      eq.emit('query',err,{'xx':'i am emit by eventQ'})//触发query事件  else    eq.once('query',cb)//将要执行的任务绑定到eq的query事件队列中,注:once代表仅触发一次

注意,在node的api上有这么一段话:

By default EventEmitters will print a warning if more than 10 listeners are added for a particular event. This is a useful default which helps finding memory leaks. Obviously not all Emitters should be limited to 10. This function allows that to be increased. Set to zero for unlimited.

每个eventEmitter对象的一个监听事件,  如果绑定的任务超过了10个,就会报一个warnning。所以这里需要调用emitter.setMaxListeners(n) 方法 修改他的默认事件个数


参考内容:

朴灵 : http://www.infoq.com/cn/articles/tyq-nodejs-event

http://nodejs.org/docs/latest/api/events.html