事件驱动模型
现在我们来看看nodejs中的事件驱动和异步I/O是如何实现的.
nodejs是单线程(single thread)运行的,通过一个事件循环(event-loop)来循环取出消息队列(event-queue)中的消息进行处理,处理过程基本上就是去调用该消息对应的回调函数。消息队列就是当一个事件状态发生变化时,就将一个消息压入队列中。
nodejs的时间驱动模型一般要注意下面几个点:
因为是单线程的,所以当顺序执行js文件中的代码的时候,事件循环是被暂停的。
当js文件执行完以后,事件循环开始运行,并从消息队列中取出消息,开始执行回调函数
因为是单线程的,所以当回调函数被执行的时候,事件循环是被暂停的
当涉及到I/O操作的时候,nodejs会开一个独立的线程来进行异步I/O操作,操作结束以后将消息压入消息队列。
下面我们从一个简单的js文件入手,来看看 nodejs是如何执行的。
代码如下 | 复制代码 |
varfs = require("fs"); vardebug = require('debug')('example1');
debug("begin");
fs.readFile('package.json','utf-8',function(err,data){ if(err) debug(err); else debug("get file content"); });
setTimeout(function(){ debug("timeout2"); }); |
debug('end');// 运行到这里之前,事件循环是暂停的
同步执行debug("begin")
异步调用fs.readFile(),此时会开一个新的线程去进行异步I/O操作
异步调用setTimeout(),马上将超时信息压入到消息队列中
同步调用debug("end")
开启事件循环,弹出消息队列中的信息(目前是超时信息)
然后执行信息对应的回调函数(事件循环又被暂停)
回调函数执行结束后,开始事件循环(目前消息队列中没有任何东西,文件还没读完)
异步I/O读取文件完毕,将消息压入消息队列(消息中含有文件内容或者是出错信息)
事件循环取得消息,执行回调
程序退出。
敢达决战官方正版 安卓版v6.7.9
下载敢达决战 安卓版v6.7.9
下载像素火影骨架佐助 (Perseverance Fire Shadow)手机版v1.16
下载要塞英雄 安卓版v33.20.0-39082670-Android
下载梦想城镇vivo最新版本 安卓版v12.0.1
梦想城镇vivo版是这款卡通风模拟经营类手游的渠道服版本,玩
怦然心动的瞬间 安卓版v1.0
怦然心动的瞬间是一款真人向的恋爱互动游戏,在游戏中玩家将扮演
曼尼汉堡店游戏 安卓版v1.0.3
曼尼汉堡店是一款非常好玩的精品恐怖类型冒险游戏,在这款游戏中
现代总统模拟器去广告版 安卓版v1.0.46
现代总统模拟器是一款休闲养成类游戏,可能对于不少的玩家来说都
现代总统模拟器付费完整版 安卓版v1.0.46
现代总统模拟器高级版在商店是需要付费的,相对于普通版本,高级