以其高性能,异步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,作为一个基于Chrome V8引擎的JavaScript运行环境,自其诞生以来,就以其高效、异步非阻塞I/O以及事件驱动的特性,迅速在Web开发领域崭露头角。本资料将带你深入探索Node.js的核心思想,并剖析其背后的libuv...
Node.js的异步非阻塞I/O模型使得它可以高效地处理高并发场景。事件循环是Node.js处理并发事件的一种机制,它依赖于libuv库来实现。当Node.js启动时,会创建一个事件循环,每个I/O事件发生时,该事件会被放入相应的...
Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用程序运行单线程,尽管 Node.js 使用多个线程来处理文件和网络事件。由于 Node.js 的异步特性,它通常用于实时应用程序。 ...
Node.js:异步编程与事件循环.docx
* 非阻塞 I/O: Node.js 使用非阻塞 I/O 模式,这意味着当线程遇到 I/O 操作时,不会被阻塞,而是继续执行下一条指令。 * 事件驱动机制: Node.js 使用事件驱动机制来处理请求,每个任务都被当作事件来处理。 Node....
### 专业Node.js:构建基于JavaScript的可扩展软件 #### 引言 随着网络应用程序的不断增长和发展,对高效、可扩展的技术栈需求也日益增加。Node.js作为一款基于Chrome V8引擎的JavaScript运行环境,提供了强大的...
Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用程序运行单线程,尽管 Node.js 使用多个线程来处理文件和网络事件。由于 Node.js 的异步特性,它通常用于实时应用程序。 ...
在Node.js的世界里,C++扩展是提高性能、利用底层系统能力的重要手段,它允许开发者访问C++的强大功能并将其集成到JavaScript环境中。 1. **Node.js的模块系统**: Node.js采用CommonJS模块规范,允许代码以模块化...
Node.js是基于Chrome V8引擎的JavaScript运行环境,它以其非阻塞I/O、事件驱动的特性在服务器端编程领域独树一帜,尤其适合构建高性能的网络应用。本书通过115个关键技巧的讲解,全面覆盖了Node.js的基础到高级应用...
Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用程序运行单线程,尽管 Node.js 使用多个线程来处理文件和网络事件。由于 Node.js 的异步特性,它通常用于实时应用程序。 ...
Node.js是一种基于Chrome V8引擎的JavaScript运行环境,它以其非阻塞I/O和事件驱动的模型,为构建高性能的网络应用提供了可能。 Node.js的核心特性包括单线程事件循环、异步编程、模块系统以及强大的文件系统操作等...
Node.js 的核心特性之一是其非阻塞 I/O 模型,这使得 Node.js 在处理大量并发连接时表现出色。v16.16.0 版本继续优化了这一特性,提升了在高并发场景下的性能。此外,Node.js 内置了事件驱动架构,通过事件循环机制...
- **非阻塞I/O**:通过异步I/O操作,Node.js 可以处理大量并发请求,无需等待单一I/O操作完成,提高了系统效率。 - **单线程**:尽管Node.js在底层多线程处理,但对外表现为单线程模型,降低了复杂性,同时通过...
Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用程序运行单线程,尽管 Node.js 使用多个线程来处理文件和网络事件。由于 Node.js 的异步特性,它通常用于实时应用程序。 ...
Node.js 的特点是异步 I/O 模型,事件驱动和非阻塞式 I/O,这使得 Node.js 能够处理高并发请求,且性能非常优越。 Node.js 的应用场景非常广泛,包括 Web 开发、移动应用开发、实时数据处理、游戏开发等。 本教程...
Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用程序运行单线程,尽管 Node.js 使用多个线程来处理文件和网络事件。由于 Node.js 的异步特性,它通常用于实时应用程序。 ...
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。安装 Node.js 需要注意以下几点: Node.js 简介 Node.js 是运行在服务端的 JavaScript,...
在IT行业中,Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它以其高效、轻量级和非阻塞I/O模型而备受推崇,尤其适用于构建网络应用和服务。本专题《深入浅出js(Node.js)异步流程控制》将探讨Node.js中的...
- 该章节提供了Node.js的基本概念介绍,涵盖了其设计哲学、非阻塞I/O模型以及事件驱动架构等核心特性。 #### 二、Node.js核心API基础 - **加载模块**(第三章) - 探讨了Node.js中的模块系统,包括CommonJS规范...