NodeJS 如何手动实施背压

toiithl6  于 2023-05-17  发布在  Node.js
关注(0)|答案(1)|浏览(115)

我有一个子进程,因为我正在将流通过管道传输到父进程。
在child.js中

let stream = readdirp(pathname);
  stream.pipe.pipe(process.stdout);

在parent.js中

let file = child => {
  let estream = es.map((data, next) => {
    _this.s3MultiUpload(JSON.parse(data), data, next);
    //i uploding this files to s3.
  });
  child.on("end", (code, signal) => {
    console.log("stream ended"); // `here is my problem`
    child.kill();
  });
  child.on("exit", (code, signal) => {
    console.log(code);
    console.log(signal);
    child.kill();
  });
  return estream;
};
child = fork(filePath, { silent: true });
child.stdout.pipe(this.file(child));

我的问题是在我上传所有文件到s3流结束。我学习了反压,但我不明白如何在这里实现?
我想我需要添加回调或其他东西来处理标准输出管道。我不知道
你能帮帮我吗

lpwwtiir

lpwwtiir1#

这种方法复杂得不必要。由于IO操作不受CPU限制,我们最好使用Promises以及JavaScript的async/await*语法来执行并行文件上传。构建我们自己的同步机制是复杂的,并且有许多重叠的语言和库级别的概念出现1
基于 readdirp 文档,但注意到我对特定的上传API并不熟悉,我建议沿着以下代码

const readdirp = require('readdirp');
const util = require('util');
const fs = require('fs');

const readfile = util.promisify(fs.readfile);

(async function () {
  // Use streams to achieve small RAM & CPU footprint.
  // 1) Streams example with for-await. Node.js 10+ only.
  const paths = [];
  for await (const {path} of readdirp('pending-uploads')) {
    paths.push(path);
  }

  const uploadPromises = paths
    .map(readFile)
    .map(JSON.parse).
    .map(data => s3MultiUpload(data));

  await Promise.all(uploadPromises);
}());

1.反压是在将响应式扩展库移植到Java中实现它的JVM的过程中产生的这些概念之一。只是为了论证(理智?)考虑what Erik Meijer says regarding backpressure

相关问题