说到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
- 说到nodejs的事件队列
- NodeJS 异步操作:事件队列的有序与并发操作
- NodeJS事件的使用
- nodejs的事件EventEmitter
- nodeJs的事件机制
- Nodejs的事件驱动模式
- nodejs的事件驱动模型
- RunLoop的事件队列
- redis+nodejs实现队列的思路
- Nodejs 数组的队列以及forEach应用
- nodejs事件
- nodejs 事件
- 说到关于年轻有为的人
- nodejs单线程、异步事件的理解
- nodejs事件发布/订阅Emitter的使用
- 剖析NodeJs的事件轮询机制
- nodejs事件的监听与事件的触发
- libevent 事件的优先级队列
- 解决重大民生问题的急救物联网——中国首个胸痛急救物联网成功运营的启示(转载)
- 二叉排序树
- document.documentElement.clientHeight
- [iOS] NSLayoutConstraint
- Servlet初始化参数与上下文初始化参数的获取
- 说到nodejs的事件队列
- Android中BaseAdapter的理解【IT168技术】
- 哈尔滨瑞杰培训的PHP课程视频
- EL 表达式
- Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍 .
- oracle索引整理
- Oracle的索引类型及使用技巧
- 【1.4】系统漫游——系统硬件结构以及程序执行过程
- Redis系列-远程连接redis并给redis加锁