以其高性能,异步IO著称,当然node.js 在 stream 上的异步也非常到位. 我们一般理解的异步请求是这样的: 同时处理多件件事件 A,B,C,D,E,F,G .... 如果用.net语言去处理这些事情可能有2钟情况 (1) A,B ..... G 按照顺序一件一件处理,最后得到返回值. (2)开启多线程去同时执行多个事件. 而node是单线程处理语言,天生就不是富二代,资源还有限......上帝造物的时候是公平,当你发现关上一扇门的话,同时肯定会为你开一扇窗.所以 node 有了异步回调. 所以node.js下的处理可能是这样的: A,B ...... G 依然是按照这个顺序处理,但是得到的返回值可能是先返回 G 然后得到 A 的.

那么IO操作中 stream 是如何处理的呢?

var fs = require('fs')fs.readFile('/etc/hosts', function (err, buffer) {if (err) {    return console.error(err.stack)}console.log(buffer.toString('utf8'))
})

这种方式是读取一个文件到内存中,然后再输出到控制台,必须先全部读取文件在先,而后从内存写入到 console,中间可能有等待,当然这是个非常小的文件. 上面的方法和其他同步语言处理文件貌似没有俩样,如果遇到特别大的文件,而且node.js是单进程,这样必须会堵塞啊,其实node.js 还有一种在IO操作文件上的异步. 我的cod文件夹下有个比较大的文件文件

node.js 使用另外一种异步处理文件流的方式读取大文件.

var fs=require('fs');
var http=require('http');var server=http.createServer(function(req,res){var stream=fs.createReadStream(__dirname+'/data.txt',{flags:'r'});stream.pipe(res);
});server.listen(9999);

和上面的代码比较,有俩处变动,fs 用了 createReadStream  , stream.pipe

这种方式并不是一下把整个文件读入内存,而是从文件变为读取流后有进过管道(pipe) 到 response 流中.

通俗点讲就是相当于拿了一根管子,一头是 file stream 入口,一头是 response stream 出口,有了这个管子读取再大的文件都是易如反掌.

下面我们用2个桶子来比喻:

如果都从顶部注水,上边的水桶必须关闭水龙头后才能执行下一步操作.

下边的水桶因为本身自带了一个小水龙头,所以不需要关闭注水水龙头也可以进行下一步操作.那么下边的水桶工作模式是异步无阻塞的.

所以上面的代码把6.7M的文件一点一点读出来再通过管道一点一点response到页面,对用户来说是不需要等待的,这种流的异步处理非常有效率.

原文:http://yijiebuyi.com/blog/8e86c479d2d290f98c1d1581a61f1396.html

本文转自:Node.js:海量数据大行其道的今天 node.js 在IO方面如何异步非阻塞

Node.js:海量数据大行其道的今天 node.js 在IO方面如何异步非阻塞相关推荐

  1. node异步非阻塞的杂谈

    引言 node作为服务器的优势就在于适合处理高并发的请求,对于web网站后台这种I/O密集型的后台尤其有优势,其核心就在于node是一个异步非阻塞模型.关于异步,同步,阻塞,非阻塞这些概念,本文不做讨 ...

  2. 理解Node.js的异步非阻塞I/O模型

    对后台服务器编程不清楚,通过在网上查资料也就大概有写了解. Apache对并发请求的处理方式是,对每个请求就创建一个线程处理,这个线程是堵塞的.因为线程的是占用内存的,所以一台服务器能支持的并发线程量 ...

  3. Node.js 系列:构建原生 Node.js 应用

    原生 Node.js 应用 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境 Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效 Nod ...

  4. 创业笔记-Node.js入门之阻塞与非阻塞

    阻塞与非阻塞 正如此前所提到的,当在请求处理程序中包括非阻塞操作时就会出问题.但是,在说这之前,我们先来看看什么是阻塞操作. 我不想去解释"阻塞"和"非阻塞"的 ...

  5. node.js中模块_在Node.js中需要模块:您需要知道的一切

    node.js中模块 by Samer Buna 通过Samer Buna 在Node.js中需要模块:您需要知道的一切 (Requiring modules in Node.js: Everythi ...

  6. 【Part2】用JS写一个Blog (node + vue + mongoDB)

    [Part1]用JS写一个Blog (node + vue + mongoDB) 上一节前后端项目分别初始化完成,这一小节我就从后端项目开始写.实现mongoDB数据库的连接. 整理后端目录 下面是通 ...

  7. js和css和img,Node.js压缩web项目中的js,css和图片

    安装node.js 这个非常简单,下载下来,配置下环境变量就可以了,使用node -v查看是否安装成功 安装压缩需要的模块分别是uglify-js,clean-css,node-smushit 命令是 ...

  8. 如何让服务器运行js,服务器端JavaScript运行环境Node.js的依赖性管理

    众所周知,Node.js是一个基于Chrome V8引擎的服务器端JavaScript运行环境.它采用了一种事件驱动的.非阻塞式的I/O模式,运行起来既轻量级又高效.诚然,我们可以使用单个js文件,来 ...

  9. 网易智慧企业Node.js实践(1) | Node应用架构设计和React同构

    导读: 近期网易智慧企业在 Node.js(以下简称 Node) 的接入上已输出阶段性成果,特推出此系列文章,希望能与大家分享部分接入过程的方案,从而提供帮助.系列主要包括以下内容. 1. Node ...

最新文章

  1. Spring注解 开发
  2. extensionloaded php,php中extension_loaded()函数的使用详解
  3. 重构实践:体验interface的威力(一)
  4. 数据中心电池室管理之经济实用性方法的探索
  5. Android的Crash崩溃解决方案-Bugly的使用
  6. 判断手势_手势密码有几种?
  7. 2019年第十届蓝桥杯 - 省赛 - C/C++大学B组 - I. 后缀表达式
  8. HBase ACL管理 Hbase 权限管理
  9. 计算机平面设计专业有哪些课程,计算机平面设计专业课程有哪些?
  10. transition属性定义动画
  11. 斯蒂芬金被退稿_斯蒂芬·金(Stephen King)对技术作家的实用建议
  12. Docker存储卷基本操作
  13. Python的二进制位运算
  14. Linux下VirtualBox出现kernel driver not installed的解决方法
  15. ApacheCN 翻译/校对/笔记整理活动进度公告 2019.9.27
  16. 前端数据可视化D3 ——(案例1)柱状图
  17. 汽车传感器:自动驾驶“第一步”,新兴领域中国有望突围
  18. [白话解析] 深入浅出支持向量机(SVM)之核函数
  19. 互联网运营面试题_网站运营面试常见问题和答案
  20. 【日常】从批量合并 PDF 到 PyPDF2 的使用

热门文章

  1. Addition Chains(信息学奥赛一本通-T1443)
  2. 理论基础 —— 查找
  3. 凌乱的yyy(洛谷-P1803)
  4. 魔法照片(洛谷-P1583)
  5. math.floor()和math.ceil()的使用
  6. android https详解,如何使用HTTPS和HTTP来解析Android中的JSON数据?
  7. Docker运行tensorflow试试
  8. linux笔记_timeval
  9. mysql中的视图_分布式 | DBLE 是如何实现视图的?
  10. 录音喊话器的故障修理_我司quot;XAHHQ1型quot;喊话器 通过公安部检测