`
天梯梦
  • 浏览: 13733561 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

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

 
阅读更多

666

 

以其高性能,异步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文件夹下有个比较大的文件文件 

 

777

 

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个桶子来比喻:

888999

 

 

 

 

 

 

 

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

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

 

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

 

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Node.js-深入理解Node.js核心思想与源码分析

    Node.js,作为一个基于Chrome V8引擎的JavaScript运行环境,自其诞生以来,就以其高效、异步非阻塞I/O以及事件驱动的特性,迅速在Web开发领域崭露头角。本资料将带你深入探索Node.js的核心思想,并剖析其背后的libuv...

    深入理解Node.js:核心思想与源码分析

    Node.js的异步非阻塞I/O模型使得它可以高效地处理高并发场景。事件循环是Node.js处理并发事件的一种机制,它依赖于libuv库来实现。当Node.js启动时,会创建一个事件循环,每个I/O事件发生时,该事件会被放入相应的...

    Node.js(node-v16.15.1-win-x64.zip)

    Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用程序运行单线程,尽管 Node.js 使用多个线程来处理文件和网络事件。由于 Node.js 的异步特性,它通常用于实时应用程序。 ...

    Node.js:异步编程与事件循环.docx

    Node.js:异步编程与事件循环.docx

    Node.js开发-Node.js入门.pdf

    * 非阻塞 I/O: Node.js 使用非阻塞 I/O 模式,这意味着当线程遇到 I/O 操作时,不会被阻塞,而是继续执行下一条指令。 * 事件驱动机制: Node.js 使用事件驱动机制来处理请求,每个任务都被当作事件来处理。 Node....

    Professional Node.js Building Javascript Based Scalable Software

    ### 专业Node.js:构建基于JavaScript的可扩展软件 #### 引言 随着网络应用程序的不断增长和发展,对高效、可扩展的技术栈需求也日益增加。Node.js作为一款基于Chrome V8引擎的JavaScript运行环境,提供了强大的...

    Node.js(node-v16.15.1-win-x86.zip)

    Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用程序运行单线程,尽管 Node.js 使用多个线程来处理文件和网络事件。由于 Node.js 的异步特性,它通常用于实时应用程序。 ...

    Node.js来一打 C++ 扩展.源码

    在Node.js的世界里,C++扩展是提高性能、利用底层系统能力的重要手段,它允许开发者访问C++的强大功能并将其集成到JavaScript环境中。 1. **Node.js的模块系统**: Node.js采用CommonJS模块规范,允许代码以模块化...

    Node.js硬实战 115个核心技巧.pdf

    Node.js是基于Chrome V8引擎的JavaScript运行环境,它以其非阻塞I/O、事件驱动的特性在服务器端编程领域独树一帜,尤其适合构建高性能的网络应用。本书通过115个关键技巧的讲解,全面覆盖了Node.js的基础到高级应用...

    Node.js(node-v16.15.1.pkg)

    Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用程序运行单线程,尽管 Node.js 使用多个线程来处理文件和网络事件。由于 Node.js 的异步特性,它通常用于实时应用程序。 ...

    Node.js By Example

    Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它以其非阻塞I/O和事件驱动的模型,为构建高性能的网络应用提供了可能。 Node.js的核心特性包括单线程事件循环、异步编程、模块系统以及强大的文件系统操作等...

    node.js(v16.16.0) 安装包

    Node.js 的核心特性之一是其非阻塞 I/O 模型,这使得 Node.js 在处理大量并发连接时表现出色。v16.16.0 版本继续优化了这一特性,提升了在高并发场景下的性能。此外,Node.js 内置了事件驱动架构,通过事件循环机制...

    node.js 安装包 10.16.3-x64

    - **非阻塞I/O**:通过异步I/O操作,Node.js 可以处理大量并发请求,无需等待单一I/O操作完成,提高了系统效率。 - **单线程**:尽管Node.js在底层多线程处理,但对外表现为单线程模型,降低了复杂性,同时通过...

    Node.js(node-v16.15.1-linux-armv7l.tar.xz)

    Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用程序运行单线程,尽管 Node.js 使用多个线程来处理文件和网络事件。由于 Node.js 的异步特性,它通常用于实时应用程序。 ...

    Node.js入门教程.pdf

    Node.js 的特点是异步 I/O 模型,事件驱动和非阻塞式 I/O,这使得 Node.js 能够处理高并发请求,且性能非常优越。 Node.js 的应用场景非常广泛,包括 Web 开发、移动应用开发、实时数据处理、游戏开发等。 本教程...

    Node.js(node-v16.15.1.tar.gz 源码)

    Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用程序运行单线程,尽管 Node.js 使用多个线程来处理文件和网络事件。由于 Node.js 的异步特性,它通常用于实时应用程序。 ...

    安装node.js.doc

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。安装 Node.js 需要注意以下几点: Node.js 简介 Node.js 是运行在服务端的 JavaScript,...

    Node.js-StuQ分享专题《深入浅出jsNode.js异步流程控制》完整版

    在IT行业中,Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它以其高效、轻量级和非阻塞I/O模型而备受推崇,尤其适用于构建网络应用和服务。本专题《深入浅出js(Node.js)异步流程控制》将探讨Node.js中的...

    professional_node.js

    - 该章节提供了Node.js的基本概念介绍,涵盖了其设计哲学、非阻塞I/O模型以及事件驱动架构等核心特性。 #### 二、Node.js核心API基础 - **加载模块**(第三章) - 探讨了Node.js中的模块系统,包括CommonJS规范...

Global site tag (gtag.js) - Google Analytics