我正在尝试通过节点画布在一个循环中写入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添加到队列中?如何确定限制已打开的流的数量以及如何管理它们?
答案 0 :(得分:0)
您必须使用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的工作原理,请看看