小结Node.js中非阻塞IO和事件循环_node.js
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了小结Node.js中非阻塞IO和事件循环_node.js,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2611字,纯文字阅读大概需要4分钟。
内容图文
学习和使用Node.js已经有两个月,使用express结合mongoose写了一个web应用和一套RESTful web api,回过头来看Node.js官网首页对Node.js的介绍:Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient.那么其中的non-blocking I/O model 意味着什么呢?非阻塞的IO模型
首先,IO操作无疑是耗时的,当服务器端接收到大量请求时,为每一个请求创建进程或线程的同时,也增加了额外的内存开销,也可能浪费更多的时间资源。
由于Node.js是事件驱动的,于是它使用了事件循环来解决IO操作带来的瓶颈问题。在Node.js中,一个IO操作通常会带有一个回调函数,当IO操作完成并返回时,就会调用这个回调函数,而主线程则继续执行接下来的代码。简单的用一个例子来说明这个问题:
这段代码的意思是向'http://www.google.com'发出请求,当请求返回这则调用回调函数输出响应信息。由于Node.js的运行机制,这段代码运行后,会立即在控制台输出'Done!',然后一段时间后再输出响应的信息。
事件循环 event loop
接下来,来讨论下事件循环的机制。首先说说调用桟,比如有如下一段代码:
当代码执行后,函数A首先被推入调用桟中成为栈顶元素并开始执行A,在执行过程中函数B又被推入调用桟成为栈顶元素,在B执行完成后,B被弹出调用桟,A再次成为栈顶元素,在A执行完成后A被弹出调用桟,调用桟呈空闲状态。
在Javascript运行时中存在一个消息队列,而消息和一个回调函数相关联,当一个事件被触发时,如果这个事件有相应的回调函数,则该消息就会被加入到消息队列中去。
回过头来说事件循环到底循环的是什么,在代码开始执行后,函数被不断推入调用桟中,就拿上面的例子来讲,request被推入调用桟中,这个函数将进行一个http请求(这个http请求将交由Node.js的底层模块来实现)同时请求完成的事件和一个回调函数关联起来,request被弹出调用桟,console.log被推入调用桟开始执行。当请求完成时,完成事件被触发,一条消息被添加进消息队列中,消息队列首先会检查调用桟是否为空闲状态,如果调用桟并不空闲,则会一直等待到调用桟空闲状态后,将消息队列的头部弹出,此时与该消息相关联的回调函数被执行。
小结
以上就无阻塞模型和事件循环在概念上进行了总结。而这个事件循环的机制并不仅仅是Node.js所独有的,并且Node.js的代码是单线程执行的,在面对大量并发请求的时候,又有着什么优势呢?
上面这张图展示了Node.js的架构图,Node.js的底层有一个模块负责维护线程池,当一个IO请求发出的时候,Node.js的底层模块将新建一个线程来处理请求,完成后再将结果交还给上层。那么,当有多个请求的时候,Node.js的底层模块将利用尽可能少的线程来完成最多的任务,如果存在空闲的线程,它将继续被利用来做其他的事情,这对于前面说的针对每个请求开一个新的进程或线程而言,无疑“聪明”许多,也更加高效了。
这篇文章是对学习Node.js的一个总结,其中若有问题和不足,欢迎批评指正。
内容总结
以上是互联网集市为您收集整理的小结Node.js中非阻塞IO和事件循环_node.js全部内容,希望文章能够帮你解决小结Node.js中非阻塞IO和事件循环_node.js所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。