跳到主要内容

并发控制

2024年04月08日
柏拉文
越努力,越幸运

一、认识


实现一个批量请求函数 multiRequest(urls, maxNum),要求如下:

  • 要求最大并发数 maxNum
  • 每当有一个请求返回,就留下一个空位,可以增加新的请求
  • 所有请求完成后,结果按照 urls 里面的顺序依次打出

二、实现


function request(arg) {
return new Promise((resolve) => {
setTimeout(() => {
console.log("arg", arg);
if (arg === 3000) {
console.timeEnd("timer");
}
resolve(arg);
}, arg);
});
}

function multiRequest(urls, maxNum) {
let index = 0;
let running = 0;
let result = new Array(urls.length).fill(false);

return new Promise((resolve, reject) => {
const launchRequest = () => {
if (index >= urls.length) {
if (running === 0) {
resolve(result);
}
return;
}

const urlIndex = index++;
running++;

request(urls[urlIndex])
.then((res) => {
result[urlIndex] = res;
})
.catch((err) => {
reject(err);
})
.finally(() => {
running--;
launchRequest();
});
};

while (running < maxNum && index < urls.length) {
launchRequest();
}
});
}

三、测试


const requestArray = [
1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000
];

console.time('timer');
multiRequest(requestArray, 2)
.then(res => {
console.log(res);
})
.catch(error => {
console.log(error);
});