node是单线程非阻塞异步I/O的模式。

  • 阻塞I/O:完成整个数据获取的过程;
  • 非阻塞I/O:不带数据,直接立即返回,要获取数据,还需通过文件描述符再次读取。

node完成整个异步I/O的有事件循环、观察者、请求对象、执行回调;

  • 事件循环:这是node自身的执行模式。在进程启动时,node会创建一个循环,每执行一次循环就会查看是否有事件处理,有,就取出事件及相关的回调函数。如果存在关联的回调函数,就执行他们,然后进入下一个循环,如果不在有事件处理就退出循环。
  • 观察者:浏览器在解析页面时,有些事件可能是来自用户的点击或者加载某些文件是产生,而这些产生的事件都是相应的观察者,当我们在执行一个node进程的时候,每一个事件循环都有一个或多个观察者,而判断是否有事件要处理的过程就是向这些观察者询问是否有要处理的事件。
  • 请求对象:我们在进行异步调用的时候就会封装一个请求对象,用于放入I/O线程池等待执行,已完成整个异步I/O的I/O操作。
  • 执行回调:组装好请求对象,然后总入I/O线程池等待执行,实际上是完成了异步I/O的第一部分,回调执行时第二部分。在每次事件循环执行中,他调用的请求对象都会加入到I/O观察者的队列,然后将其当做事件处理。
  • 整个异步I/O的流程图:

  • 总结
    异步调用——(请求对象)——>I/O线程池——(观察者)——>事件循环。

Node的异步I/O的更多相关文章

  1. 深入浅出node(3) 异步I/O

    这篇主要整理深入浅出Node.js第三章 异步I/O 一) 异步I/O的原因 二)异步I/O实现现状 2.1 异步I/O与非阻塞I/O 2.2 轮询 2.3 理想的非阻塞异步I/O 2.4 现实的异步 ...

  2. 深入浅出node(4) 异步编程

    一)函数式编程基础 二)异步编程的优势和难点 2.1 优势 2.2 难点 2.2.1 异常处理 2.2.2 函数嵌套过深 2.2.3 阻塞 2.2.4 多线程编程 2.2.5 异步转同步 三)异步编程 ...

  3. Node.js异步处理CPU密集型任务

    Node.js异步处理CPU密集型任务 Node.js擅长数据密集型实时(data-intensive real-time)交互的应用场景.然而数据密集型实时应用程序并非仅仅有I/O密集型任务,当碰到 ...

  4. Node.js 异步异闻录

    本文首发在个人博客:http://muyunyun.cn/posts/7b9fdc87/ 提到 Node.js, 我们脑海就会浮现异步.非阻塞.单线程等关键词,进一步我们还会想到 buffer.模块机 ...

  5. node.js异步编程的几种模式

    Node.js异步编程的几种模式 以读取文件为例: 1.callback function const fs = require('fs'); //callback function fs.readF ...

  6. 深入理解node.js异步编程:基础篇

    ###[本文是基础内容,大神请绕道,才疏学浅,难免纰漏,请各位轻喷] ##1. 概述 目前开源社区最火热的技术当属Node.js莫属了,作为使用Javascript为主要开发语言的服务器端编程技术和平 ...

  7. node(1) npm是什么?node的异步概念

    NPM是随同的NodeJS一起安装的包管理工具 他可以做什么? 1.可以从NPM服务器下载别人的东西使用 2.可以把自己的东西传到NPM服务器,让别人下载使用 淘宝的镜像会快一点      cnpm ...

  8. node.js异步编程解决方案之Promise用法

    node.js异步编程解决方案之Promise var dbBase = require('../db/db_base'); var school_info_db = require('../db/s ...

  9. node 单线程异步非阻塞

    链接:http://www.runoob.com/nodejs/nodejs-callback.html 首先什么是单线程异步非阻塞? 单线程的意思整个程序从头到尾但是运用一个线程,程序是从上往下执行 ...

  10. Node.js异步IO原理剖析

    为什么要异步I/O? 从用户体验角度讲,异步IO可以消除UI阻塞,快速响应资源 JavaScript是单线程的,它与UI渲染共用一个线程.所以在JavaScript执行的时候,UI渲染将处于停顿的状态 ...

随机推荐

  1. [note]克鲁斯卡尔重构树

    克鲁斯卡尔重构树 又叫并查集重构树 大概在NOI2018之前还是黑科技 现在?烂大街了 主要是针对图上的对边有限制的一类问题 比如每次询问一个点u不能经过边权大于w的边能走到的第k大点权是多少 也就是 ...

  2. MySQL root用户忘记密码怎么办?修改密码方法:skip-grant-tables

    忘记密码怎么办? 1.以管理员身份打开cmd2.执行命令tasklist |findstr mysql ,查看正在运行的mysql进程 3.执行命令taskkill /F /PID 13644(此处进 ...

  3. Python判断网络是否可以访问

    import urllib url = "http://www.baidu.com" try: status = urllib.urlopen(url).code print st ...

  4. 转载:阮一峰 RESTful API设计指南

    阮一峰先生的文章对我理解启发很大,转载到我的博客 http://www.ruanyifeng.com/blog/2014/05/restful_api.html 网络应用程序,分为前端和后端两个部分. ...

  5. nodejs中全栈开发框架meteor的文档

    http://wiki.jikexueyuan.com/project/discover-meteor/routing.html,   这本书的源码地址: https://github.com/Dis ...

  6. python2 和 pyhton3 输入语句写法

    Python的输入语句类型 1 python2的输入语句 在python2中有两种常见的输入语句,input()和raw_input(). (1)input()函数 可以接收不同类型的参数,而且返回的 ...

  7. 41和为S的连续正数序列

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...

  8. iOS Xcode 8 快捷键 (注释 失效 处理)

    在升级后,好用的VVDocumment 插件不能用了.(但是苹果这次内置了好多好用的插件,也有自己的注释功能了 AddDocumentation) 上网上有查到 传播很广泛的一条信息 "这个 ...

  9. JAVA中的Token 基于Token的身份验证

    最近在做项目开始,涉及到服务器与安卓之间的接口开发,在此开发过程中发现了安卓与一般浏览器不同,安卓在每次发送请求的时候并不会带上上一次请求的SessionId,导致服务器每次接收安卓发送的请求访问时都 ...

  10. 【HackerRank】 Chocolate Feast

    Little Bob loves chocolates, and goes to the store with $N money in his pocket. The price of each ch ...