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