阅读更多

0顶
0踩

Web前端

学习和使用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的一个总结,其中若有问题和不足,欢迎批评指正。

 

参考:

  • 大小: 5.1 KB
  • 大小: 6.4 KB
  • 大小: 19.9 KB
0
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 小结Node.js中非阻塞IO和事件循环

    本文针对在Node.js关键的两个概念:非阻塞IO和事件循环进行了适当的总结,需要的朋友可以参考下

  • 了解Windows防火墙的优缺点

    Learn the pros and cons of Windows Firewall了解Windows防火墙的优缺点《endurer注:pros and cons 正反面,优缺点,利弊》英文来源:http://techrepublic.com.com/5100-1009_11-6063367.html?tag=nl.e101by  Michael Mullins CCNA, MCP作者:

  • 安全第一!服务器软件防火墙如何选择

    首先要说明的是,服务器一般会有两种使用方式,一种是托管的服务器,或者是在IDC租用的服务器,此时需要的是单机防火墙;另外一种是公司学校的局域网服务器,这种一般是作为网络出口的桥头堡,保护整个局域网的安全,这时要使用专门的网关防火墙。 另外,不同的操作系统使用的防火墙肯定也是相去甚远的,目前主流的操作系统当然就是WINDOWS和Linux,下面我们按照两类操作系统对几款比较值得推荐的防火墙软件进行

  • nbio:Ruby 的 Node.js 中的非阻塞 IO 事件循环

    纯 Ruby 中的 Node.js 中的非阻塞 IO 事件循环,严格基于核心 select() 和 IO 类。 ## 哲学 以简单、极简和代码清晰的方式编写 没有线程安全来保持代码简单 没有伪装成 C 静态变量、Ruby 常量或类变量的全局变量 ...

  • Node.js 非阻塞IO和事件循环

    非阻塞的IO模型 ... 由于Node.js是事件驱动的,于是它使用了事件循环来解决IO操作带来的瓶颈问题。在Node.js中,一个IO操作通常会带有一个回调函数,当IO操作完成并返回时,就会调用这个回调函数,而主...

  • Node.js 非阻塞式I/O的理解

    Node.js 设计之初的愿望,就是打造一个高性能的,轻量级的 Web 服务器。 而传统Web服务器,如Apache Tomcat,该服务器是基于Java语言开发,该语言支持多线程,早期只支持阻塞式I/O

  • node.js非阻塞io_Node.js中的阻塞和非阻塞操作

    node.js非阻塞ioIn this article, we try to provide you a detailed illustration of the difference between blocking and non-blocking calls in Nodejs. This blog will refer to the event loop and libuv. 在...

  • Node.js之非阻塞IO 与 事件循环

    非阻塞IO 1 阻塞和非阻塞的区别: 1.1 阻塞: 什么是阻塞: 无数据准备好,系统调用比如read,recvfrom就会挂起,等到有数据准备好或者有数据了才继续执行系统调用,最后才从系统调用的函数中返回 非阻塞IO ...

  • 浅谈Node 异步IO和事件循环

    学习Node就绕不开异步IO, 异步IO又与事件循环息息相关, 而关于这一块一直没有仔细去了解整理过, 刚好最近在做项目的时候, 有了一些思考就记录了下来, 希望能尽量将这一块的知识整理清楚, 如有错误, 请指点轻...

  • Node.js 中的阻塞和非阻塞io

    Node.js 是运行在服务端的 JavaScript,它具备可以处理高并发的能力,这一章作为nodejs系列文章的第一章,我们将介绍nodejs之所以性能好的原因 正文 共享状态的并发       node为...

  • Node.js非阻塞I/O和事件循环的学习总结及编程示例

    通过采用非阻塞I/O模型,Node.js能够在执行I/O操作时不阻塞后续代码的执行,提高了并发处理能力。Node.js采用了非阻塞I/O模型,它的I/O操作是异步执行的,不会阻塞后续代码的执行。当一个I/O操作被触发时,Node.js会...

  • 浅谈Node.js中的事件循环机制

    node和js的事件循环原理有所不同,即使在node 10+版本后二者的执行顺序一致。node基于libev库,js基于浏览器。js事件循环核心是宏任务和微任务,而node除此之外还有现阶段任务执行阶段 timers:本阶段执行...

  • 6.Node.js事件循环

    Node.js单线程蕾丝进入一个while(true)的事件循环,直到没有事件观察者退出,每个异步事件都生成一个事件观察者,如果有事件发生就调用该回调函数。 事件驱动程序 Node.js 使用事件驱动模型,当web server接收到...

  • Node.js 初探:事件循环、非阻塞 I/O 和异步编程简介

    事件循环、非阻塞 I/O 和异步编程使 Node.js 在处理并发请求方面表现出优越性能。

  • Node.js学习五(事件)

    文章目录一、Node.js事件循环二、事件驱动程序三、事件触发器1、EventEmitter类2、事件触发器的方法(1)EventEmitter类的on方法(2)EventEmitter类的once方法(3)使用removeListener方法取消事件处理函数(4)...

  • Node.js中的宏任务与微任务、node.js架构组成、事件循环、模拟事件、fs模块

    宏任务与微任务表示异步...微任务:promise、Object.observe(用来实时监测js中对象的变化)、 MutationObserver(监听DOM树的变化) 因为异步任务放在队列中,自然而然宏任务与微任务就存放在宏任务队列与微任务 队列中...

  • Node.js异步式/非阻塞小结

    而本人本科阶段是写java后台的,同实验室有位写Node.js的同学一直给我大力推荐Node.js,但是因为分工不同一直了解不多,只知道Node.js是用JavaScript写后端,而且据说非常简单。 后来上了研究生,接手的第一个项目...

  • nodejs事件循环与多进程(一)——事件循环允许Node.js执行非阻塞IO操作 & js是操作DOM,决定了单线程 & 事件循环之宏任务setTimeout在后、微任务promise在前

    了解事件循环的概念学习浏览器中的事件循环机制学习nodejs中的事件循环机制了解多进程,多线程之间的区别学习nodejs中的多进程并使用cluster来开启多进程为了协调事件(event),用户交互(user interaction),脚本...

Global site tag (gtag.js) - Google Analytics