当前位置: 首页 > 知识库问答 >
问题:

它们之间有什么区别。溪流上的管道

仲孙飞文
2023-03-14

我发现了两种不同的方法来在节点中对流进行管道处理。js

众所周知的流的方法

https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options

和流的独立功能

https://nodejs.org/api/stream.html#stream_stream_pipeline_streams_callback

我应该使用哪一种?这两者之间有什么好处?

共有3个答案

闾丘德宇
2023-03-14

pipeline是pipe的改进版本,它从节点开始添加到流模块中。JSV10

此外,管道接受任意数量的参数,最后一个参数是回调,用于知道管道何时结束或抛出错误。

使用管道:

mySourceStream.pipe(myStream).pipe(anotherStream)

使用管道:

mySourceStream.pipeline(myStream, anotherStream, err => {
  if (err) {
    console.log('There is an error')
  } else {
    console.log('pipeline successful')
  }
})
叶谦
2023-03-14

根据文件,他们都做同样的事情。但也有一些不同之处:

  • . tube()是Readable的方法,而管道是接受流到管道的stream的模块方法。
  • 管道()方法在管道完成时提供回调。
  • 管道()方法是自节点的10个版本以来添加的,而

在我看来,使用pipeline()。

示例。管道()

const fs = require('fs');
const r = fs.createReadStream('file.txt');
const z = zlib.createGzip();
const w = fs.createWriteStream('file.txt.gz');
r.pipe(z).pipe(w);

管道()的示例:

const { pipeline } = require('stream');
const fs = require('fs');
const zlib = require('zlib');

pipeline(
  fs.createReadStream('archive.tar'),
  zlib.createGzip(),
  fs.createWriteStream('archive.tar.gz'),
  (err) => {
    if (err) {
      console.error('Pipeline failed.', err);
    } else {
      console.log('Pipeline succeeded.');
    }
  }
);

吕鸿轩
2023-03-14

TL; DR-你最好使用管道

什么是管道?

来自文档:一种模块方法,用于在流之间传递错误并正确清理,并在管道完成时提供回调。

使用管道的动机是什么?

❌ 让我们看看下面的代码:

const { createReadStream } = require('fs');
const { createServer } = require('http');
const server = createServer(
  (req, res) => {
    createReadStream(__filename).pipe(res);
  }
);

server.listen(3000);

这里怎么了?如果响应将退出或客户端关闭连接,则读取流不会关闭或销毁,从而导致内存泄漏。

✅因此,如果您使用管道,它将关闭所有其他流,并确保没有内存泄漏。

const { createReadStream } = require('fs');
const { createServer } = require('http');
const { pipeline } = require('stream');

const server = createServer(
  (req, res) => {
    pipeline(
      createReadStream(__filename),
      res,
      err => {
        if (err)
          console.error('Pipeline failed.', err);
        else
          console.log('Pipeline succeeded.');
      }
    );
  }
);

server.listen(3000);
 类似资料:
  • 问题内容: 所述流文档状态双工流 “是同时实现可读写接口流”和变换流 “是双相流其中输出以某种方式从输入计算”。不幸的是,文档没有描述Transplex流在Duplex流之外提供的内容。 两者之间有什么区别吗?您什么时候可以使用另一个? 问题答案: 可以将双工流视为具有可写流的可读流。两者都是独立的,每个都有独立的内部缓冲区。读写事件独立发生。 转换流是双工的,其中读写以因果关系进行。双工流的端点

  • 本文向大家介绍HTML5有哪些存储类型?它们之间有什么区别?相关面试题,主要包含被问及HTML5有哪些存储类型?它们之间有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 cookie: 最大 4k, 基本无兼容问题, 所有同源tab 共享, 每次请求都携带, key-value 存储, value 只存字符串 sessionStorage 无大小限制, 只在当前 tab 有效, tab 关闭

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

  • 问题内容: 如何在hibernate中使用级联和逆运算?定义它们的过程/标签是什么?它们彼此相关吗?它们如何有用? 问题答案: 在通过中介表进行多对多关系的情况下;“级联”表示是否在子表中创建/更新记录。而“反向”表示是否在中间表中创建/更新记录 例如,假设情况1下的学生可以拥有多部电话。因此,学生班级拥有“手机套”的属性。另外,一部电话可以由多个学生拥有。因此,“电话”类具有“学生组”的属性。s

  • 我试图理解反应流和反应流之间的区别,特别是在RxJava的上下文中? 我所能理解的最多的是,反应流在规范中有一些背压的概念,但在RxJava/Reactive中已经存在了请求(n)接口。 我不介意ELI5的回答。

  • 本文向大家介绍有用过scss和sass吗?说说它们之间的区别是什么?相关面试题,主要包含被问及有用过scss和sass吗?说说它们之间的区别是什么?时的应答技巧和注意事项,需要的朋友参考一下 sass和scss其实是一样的css预处理语言,其后缀名是分别为 .sass和.scss两种。 SASS版本3.0之前的后缀名为.sass,而版本3.0之后的后缀名.scss。 两者是有不同的,继sass之后