我有一个方法可以遍历JSON有效负载来对该有效负载中的一些数据运行计算.当我创建该方法的100个promise ,然后将它们传递给Promise.all()时,似乎同时解析的每个promise 都需要更长的时间才能解决下一个promise .
这并不是我的方法所特有的,我用一个返回简单JSON数据的公共APItry 了类似的方法.在使用Promise.all并发调用该API时,我观察到了相同的事情...每一个连续的promise 都需要越来越长的时间来解决.
下面是一个简单的代码片段来说明我正在做的事情:
const axios = require('axios');
const getSomeData = async () => {
try {
await axios.get('https://some.api.com');
} catch (error) {
console.log('Failed to get data...');
}
};
const promiseList = [];
for (let i = 0; i < 100; i += 1) {
promiseList.push(new Promise(async (res) => {
const startTime = performance.now();
await getSomeData();
const stopTime = performance.now();
console.log(`time taken by promise: ${stopTime - startTime}`);
res();
}));
}
const main = async () => {
const startTime = performance.now();
await Promise.all(promiseList);
const stopTime = performance.now();
console.log(`total time taken: ${stopTime - startTime}`);
};
main();
当然,这是一个非常没有意义的方法,但我创建它是为了严格观察并发运行时promise 的行为,以及与顺序运行相比有多大的性能优势(这显然是一个重大的改进).
我的问题是,是什么导致每一个连续的promise 都需要越来越长的时间,直到所有的promise 都得到解决?在这种情况下,如果我再次运行它,它会将第一个promise 所用的时间重置为大约200毫秒,然后它会再次开始增加,直到最后一个promise 需要大约600毫秒才能解决.
这仅仅是单线程Java执行和并发的本质吗?我真的很有兴趣听到对这一现象的更深入的解释.