【问题标题】:Asynchronously writing files in a loop, how to manage streams循环异步写入文件,如何管理流
【发布时间】:2019-08-19 07:12:12
【问题描述】:

我正在尝试通过节点画布循环写入 100 多个 png 文件。仅生成 40 个文件,然后该过程完成。

我尝试通过 createPNGStream() 创建一个 png 流,并将结果通过管道传输到由 fs.createWriteStream() 创建的写入流。

写函数:

function writeFile(row, col) {
        // canvas code ...
        const stream = canvas.createPNGStream();
        let path = __dirname + '/imgs/heatmapRow' + row + "Col" + col + '.png';
        const out = fs.createWriteStream(path);
        stream.pipe(out);
        out.on('finish', () => console.log('The PNG file was created.'))
    }

调用函数:

function generateImages(){
    var numRows = 20;
    var numCols = 5;
    for(let row = 0; row < numRows; ++row) {
        for (let col = 0; col < numCols; ++col) {
            writeFile(row, col);
        }
    }
}

循环运行并完成,最后我一次得到一堆以下行:

PNG 文件已创建。 PNG文件已创建。 PNG文件已创建。 PNG 文件已创建。

我认为在每个循环中都会创建一个 writeStream 并且是异步的。该过程正在终止,因为我只能打开这么多流。

如何编写所有文件并异步执行以加快处理时间? (我不喜欢同步写入文件)我需要将每个 writeFile 添加到队列中吗?如何确定打开的流的数量限制以及如何管理它们?

【问题讨论】:

  • 所以基本上只生成40/100个文件?。你看到任何错误吗?。
  • 大约有 40 张图片。一次是 37,一次是 43。我没有任何错误。

标签: node.js fs node-canvas


【解决方案1】:

您必须使用 Promises 进行异步调用。 我给你一个解决方案:

  function writeFile(row, col) {
    // canvas code ...
    const stream = canvas.createPNGStream();
    let path = __dirname + "/imgs/heatmapRow" + row + "Col" + col + ".png";

    return new Promise(resolve => {
      const out = fs.createWriteStream(path);
      stream.pipe(out);
      out.on("finish", () => {
        console.log("The PNG file was created.");
        resolve();
      });
    });
  }

  function generateImages() {
    var numRows = 20;
    var numCols = 5;
    var imagesToGenerate = [];
    for (let row = 0; row < numRows; ++row) {
      for (let col = 0; col < numCols; ++col) {
        imagesToGenerate.push(writeFile(row, col));
      }
    }

    Promise.all(imagesToGenerate).then(() => {
      console.log("All images generated");
    });
  }

如果您不清楚它的工作原理,请查看Promise.all docs

【讨论】:

    猜你喜欢
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多