从Node.js中的一个Promise.all Promise内部更新counter是否安全


Node.js使用工作池中的线程来执行I/O操作。如果我需要同时计算多个文件中的字符数(使用Promise.all(,那么更新totalNumberOfChars变量是否安全,该变量对所有承诺的文件读取操作都是通用的?因为每个读取操作可能使用一个单独的线程,所以totalNumberOfChars可能不正确吗?

这是代码:

const fs = require("fs");
const util = require("util");
const readFileAsync = util.promisify(fs.readFile);
/**
* 
* @param {Array} pathsToFiles - array of paths to files
*/
const main = async (pathsToFiles) => {
let totalNumberOfChars = 0;
await Promise.all(
pathsToFiles.map(async (path) => {
const chars = await readFileAsync(path);
totalNumberOfChars += chars.length;
})
);
console.log("totalNumberOfChars", totalNumberOfChars);
};
main(['/home/a.txt', '/home/b.txt'])

这是安全的,因为这个函数里面有什么:

pathsToFiles.map(async (path) => {
const chars = await readFileAsync(path);
totalNumberOfChars += chars.length;
})

是同步执行的,这意味着您的文件是同步读取的(同样,在回调中!(,并且您也在同步添加到计数器中。所以在";主";函数的执行,您将得到正确的答案。

最新更新