美文网首页
实现同步控制最大并发数

实现同步控制最大并发数

作者: 看到这朵小fa了么 | 来源:发表于2020-03-24 19:59 被阅读0次
// /*
// 执行所有异步任务,但控制最大同时执行的任务数为 3 个

// 假设有一系列返回 Promise 的异步任务 jobs,每个任务所需要的时间都不相同,
// 所有任务都一定不会失败。

// 请实现一个输入为 jobs 的函数 runParallel,功能是执行 jobs 中的所有异步任务,
// 但控制最大同时执行的任务数为 3 个。

// runParallel 最终按照 jobs 数组顺序,把每个任务的返回值储存在一个数组里,
// 并返回这个数组(类似 Promise.all)。
function limitPromise(list, max) {
    let count = 0
    let taskList = []
    let resultList = Array.from(list).fill(0)
    for (let i = 0; i < list.length; i++) {
        let task = everyPromise(list[i], i)
        if (count < max) {
            task()
        } else { taskList.push(task) }

    }
    function everyPromise(item, i) {
        return () => {
            let promise = item()
            promise.then((data) => {
                count--
                resultList[i] = data
                if (taskList.length) {
                    let task = taskList.shift()
                    task()
                } else if(count==0){
                    console.log(JSON.stringify(resultList))
                }
            })
            count++
        }
    }
}

let promise0 = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(0)
            resolve(0)
        }, 5000)
    })
}
let promise1 = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(1)
            resolve(1)
        }, 3000)
    })
}
let promise2 = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(2)
            resolve(2)
        }, 1000)
    })
}
let promise3 = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(3)
            resolve(3)
        }, 1000)
    })
}
let  list= [promise0, promise1,promise2, promise3]
limitPromise(list, 3)
// 2,3,1,0
// [1,2,3,4]

// 用async实现的话会更简单 外部是同步 内部是异步
async function logInOrder(urls) {
  // 并发读取远程URL
  const textPromises = urls.map(async url => {
    return await url
  });

  // 按次序输出
  for (const textPromise of textPromises) {
    await textPromise.then(data => console.log(data));
  }
}

相关文章

网友评论

      本文标题:实现同步控制最大并发数

      本文链接:https://www.haomeiwen.com/subject/avuayhtx.html