2636. Promise Pool
题目简介
/**
* @param {Function[]} functions
* @param {number} n
* @return {Promise}
*/
题目要求我们用 promise 实现一个并发控制池 promisePool
functions 表示待执行的异步函数
n 代表最大并发数量
promisePool 只有当所有的 functions 都执行完毕之后才能 resolve
解题思路
控制并发数量的题目,一般会需要 worker 来辅助
每一个 worker 控制一个并发任务,题目要求我们最多使用 n 个并发,所以我们可以用 n 个 worker 来实现
对于每个 worker 来说,有两个任务:
- 判断当前是否有未执行任务
- 如果有,则选取其中一个未执行任务执行,直到当前任务结束
Javascript
/**
* @param {Function[]} functions
* @param {number} n
* @return {Promise}
*/
var promisePool = async function (functions, n) {
let idx = 0
const len = functions.length
const worker = async () => {
while (idx < len) {
await functions[idx++]()
}
}
const promises = new Array(n).fill(null).map(_ => worker())
await Promise.all(promises)
};