从 Node.js 中的 Promise.all 承诺之一更新计数器是否安全?

Is it safe to update counter from inside one of Promise.all promises in Node.js?

Node.js uses 个线程来自工作池以执行 I/O 个操作。如果我需要同时计算许多文件中的字符数(使用 Promise.all),更新所有 promisifed 文件读取操作共有的 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;
})

是同步执行的,这意味着您的文件是同步读取的(同样,在该回调中!)并且您也在同步添加到计数器。因此,在“主要”功能执行后,您将收到正确的答案。