我想验证我是否正在正确地等待fs.promises。
我在一个名为res的地图中有条目,我想将它写到一个文件中。
我确信这将等待他们:
for(let [path, content] of res.entries()) {
await fs.promises.writeFile(path, content)
}但是这样做效率很低,所以我很好奇这样做是否有效:
let promises = []
for(let [path, context] of res.entries()) {
promises.push( fs.promises.writeFile(path, content) );
}
await Promise.all(promises)我不确定第二个示例是否有效的原因是因为writeFile只是一个异步函数,所以我不确定await是否真的在等待什么。
其他的选择是做一些花哨的事情,让这样一条线成为可能的Promise(fs.writeFile(...)) (不可能)等待它。
发布于 2021-07-14 05:47:04
是的,只要您要写入的所有文件都是单独的文件(不对同一个文件进行重叠写入),那么Promise.all()的第二个片段就可以工作,因此所有文件都可以并行完成。
fs.promises.writeFile()返回一个承诺,该承诺将在操作完成时解决,因此您的promises数组将是一个承诺数组,这正是Promise.all()所期望的。
来自医生 for fs.promises.writeFile()的说明
返回:
<Promise>。成功时充满未定义的东西。
注意,当写入同一磁盘上的多个文件时,实际可以获得多大的并行性,这是有限制的,因为所有写操作都必须通过相同的磁盘控制器、同一总线和(如果是旋转磁盘)磁头一次只能在一个轨道上。
此外,nodejs使用线程池进行磁盘操作,它只使用少量线程进行同步请求。操作系统和nodejs将为您处理所有这些问题(通过排队写入直到轮到他们为止),这样做没有危险,但是并行编写20个文件可能并不比按顺序写入它们快20倍,但是并行写入应该更快。因此,如果代码允许并行运行,这是编写代码的理想方法。
https://stackoverflow.com/questions/68372484
复制相似问题