function asyncTask(duration) {
return new Promise((resolve) => {
setTimeout(() => {
resolve();
}, duration);
});
}
function executeTasks(tasks, concurrency) {
return new Promise((resolve) => {
let completedCount = 0;
let totalTime = 0;
const startTime = Date.now();
const taskQueue = [...tasks];
const runningTasks = [];
function startNextTask() {
if (taskQueue.length === 0 && runningTasks.length === 0) {
totalTime = Date.now() - startTime;
console.log(`所有任务执行的总时间: ${totalTime} ms`);
resolve();
return;
}
while (runningTasks.length < concurrency && taskQueue.length > 0) {
const task = taskQueue.shift();
const taskPromise = task();
runningTasks.push(taskPromise);
taskPromise.then(() => {
completedCount++;
runningTasks.splice(runningTasks.indexOf(taskPromise), 1);
startNextTask();
});
}
}
startNextTask();
});
}
// 示例任务
const tasks = Array.from({ length: 100 }, () => () => asyncTask(Math.floor(Math.random() * 1000)));
executeTasks(tasks, 5).then(() => {
console.log('所有任务已完成');
});
性能优势
- 资源优化:通过限制并发任务数量,可以避免因同时执行过多任务而耗尽系统资源,如CPU、内存等。例如在服务器端,过多的并发请求可能导致内存溢出或者CPU使用率过高,影响服务器的整体性能。
- 提高稳定性:合理的并发控制能防止系统因为过载而崩溃,确保应用程序在高负载情况下仍能稳定运行。例如在处理大量文件上传或下载任务时,如果不加以控制,可能导致网络拥堵或者系统响应缓慢。
应用场景
- 文件处理:例如批量处理图片、视频等文件,对文件进行压缩、转码等操作。通过并发控制,可以避免因同时处理过多文件而占用过多系统资源。
- 网络请求:在前端应用中,可能需要向服务器发送大量的API请求,如获取多个用户的详细信息。限制并发数量可以防止网络拥堵,提高请求成功率。
- 数据爬取:在爬虫程序中,需要从多个网页抓取数据。通过控制并发请求数量,可以避免对目标网站造成过大压力,同时防止被目标网站封禁IP。