设计思路
- 异步生成器:使用异步生成器函数来生成任务队列。
- 并发控制:利用
Promise
和async/await
来控制并发数量,通过维护一个任务数组,确保同时执行的任务不超过5个。
- 按序输出:通过
async/await
确保每个任务按顺序完成并输出结果。
JavaScript代码
function asyncTask(id) {
return new Promise((resolve) => {
setTimeout(() => {
console.log(`Task ${id} completed`);
resolve(id);
}, Math.floor(Math.random() * 1000));
});
}
async function* taskGenerator() {
for (let i = 1; i <= 100; i++) {
yield asyncTask(i);
}
}
async function executeTasks() {
const tasks = [];
const results = [];
const concurrency = 5;
const gen = taskGenerator();
// 启动初始任务
for (let i = 0; i < concurrency; i++) {
const task = gen.next();
if (!task.done) {
tasks.push(task.value.then(result => {
results.push(result);
return result;
}));
}
}
while (tasks.length > 0) {
const completedTask = await Promise.race(tasks);
tasks.splice(tasks.indexOf(completedTask), 1);
const nextTask = gen.next();
if (!nextTask.done) {
tasks.push(nextTask.value.then(result => {
results.push(result);
return result;
}));
}
}
console.log("Final results in order:", results);
return results;
}
executeTasks();