返回
高效并发请求,任务队列并发限制详解
前端
2023-09-21 19:27:53
// 请求总数量
const len = payloadList.length;
const result = [];
const requesting = [];
let finished = 0;
let active = 0;
const triggerNext = () => {
active--;
if (requesting.length > 0 && active < limit) {
startRequest(requesting.shift());
}
};
const startRequest = (payload) => {
active++;
handler(payload)
.then((res) => {
result.push(res);
triggerNext();
})
.catch((err) => {
console.log(err);
triggerNext();
});
};
for (let i = 0; i < len; i++) {
if (active < limit) {
startRequest(payloadList[i]);
} else {
requesting.push(payloadList[i]);
}
}
return new Promise((resolve) => {
const interval = setInterval(() => {
if (finished === len) {
clearInterval(interval);
resolve(result);
}
}, 10);
});
}
// 使用方法
const payloadList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const handler = (payload) => {
return new Promise((resolve) => {
setTimeout(() => {
console.log(`处理 ${payload} 完成`);
resolve(payload);
}, 1000);
});
};
multiRequestWithLimit(payloadList, handler, 3).then((res) => {
console.log('全部请求已完成');
});
任务队列并发限制简介
任务队列并发限制是一种常见的并发请求处理方式。它的基本原理是:将所有并发请求放入一个任务队列中,然后按照一定的规则对队列中的请求进行处理。当队列中的请求数量达到限制时,后续的请求将被阻塞,直到队列中的请求数量减少到限制以下。
任务队列并发限制的实现
任务队列并发限制通常使用以下步骤实现:
- 创建一个任务队列。
- 将所有并发请求放入任务队列中。
- 启动一个循环,不断从任务队列中取出请求进行处理。
- 当队列中的请求数量达到限制时,后续的请求将被阻塞,直到队列中的请求数量减少到限制以下。
- 当任务队列中的所有请求都已处理完毕,循环终止。
任务队列并发限制的优势
任务队列并发限制具有以下优势:
- 避免请求阻塞:通过限制任务队列中的请求数量,可以避免请求阻塞。
- 提高应用程序性能:通过合理设置并发限制,可以提高应用程序的性能。
- 易于实现:任务队列并发限制很容易实现,只需要使用简单的队列数据结构和循环即可。
任务队列并发限制的局限性
任务队列并发限制也存在一些局限性:
- 可能会导致请求延迟:由于任务队列并发限制的存在,后续的请求可能会被阻塞,导致请求延迟。
- 可能会导致资源浪费:如果并发限制设置过大,可能会导致资源浪费。
任务队列并发限制的使用场景
任务队列并发限制常用于以下场景:
- 网络请求:在进行大量网络请求时,可以使用任务队列并发限制来限制并发请求的数量,避免请求阻塞。
- 文件读取:在读取大量文件时,可以使用任务队列并发限制来限制并发读取文件的数量,避免文件读取阻塞。
- 数据库查询:在进行大量数据库查询时,可以使用任务队列并发限制来限制并发查询数据库的数量,避免数据库查询阻塞。
结语
任务队列并发限制是一种常见的并发请求处理方式,它具有避免请求阻塞、提高应用程序性能、易于实现等优点。但是在使用任务队列并发限制时,也需要注意其局限性,并根据实际情况合理设置并发限制。