美文网首页
前端控制并发度

前端控制并发度

作者: 大脸猫_2e21 | 来源:发表于2020-04-16 14:46 被阅读0次

-最近看到了一道面试题,觉得还蛮有意思,就实现了一下。面试题如下:

请实现如下的函数,可以批量请求数据,所有的URL地址在urls参数中,
同时可以通过max参数 控制请求的并发度。当所有的请求结束后,
需要执行callback回调。
发请求的函数可以直接使用fetch。
// 请实现如下的函数,可以批量请求数据,所有的URL地址在urls参数中,同时可以通过max参数 控制请求的并发度。当所有的请求结束后,需要执行callback回调。发请求的函数可以直接使用fetch。

const log = console.log.bind()
// 模拟异步url请求
function sleep(i) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            log(`我sleep 了${i}毫秒`)
            resolve()
        }, i)
    })
}

// 产生a- b之间的随机数
function random(a, b) {
    // floor 一个表示小于或等于指定的最大整数的数字
    return a + Math.floor(Math.random() * (b - a))
}

// 异步数组
function sleepTime(n) {
    let arrTime = []
    for (let i = 0; i < n; i++) {
        let a = random(1200, 20000)
        arrTime.push(a)
    }
    return arrTime
}
let arr = sleepTime(10)

let max = 5
// 处理并发数量最大max 数组中所有数据处理完之后 回调 cb
let cb = () => {
    log('所有的异步数据我都处理完了。。。。。')
}
function handleSleep(arr, max, cb) {
    let len = arr.length
    let index = 0
    let sleepArr = []  // 存放异步请求数组
    function doSleep() {
        if (index >= len) {
            log('要执行全部的sleep了', sleepArr)
            Promise.all(sleepArr).then(() => {
                cb()
            })
        } else if (index < len && sleepArr.length < max) {
            // 开始往sleepArr里面push异步数据
            let one = sleep(arr[index]).then(() => {
                // 这个处理完了 将其踢出异步队列
                sleepArr.splice(sleepArr.indexOf(one), 1)
                if (sleepArr.length < max && index < len) {
                // 如果此时异步数组中的长度 小于最大并发值 
              // 并且当前index < len  (说明整个数组还没有被遍历完)
              // 再次调用自身
                    return doSleep()
                }
            })
            log('one', index)
            sleepArr.push(one)
            // 每次push进去之后都会加1 只有一个地方更改数据比较安全
            index++
            doSleep()
        }
    }
    doSleep()
}

handleSleep(arr, max, cb)





相关文章

  • 前端控制并发度

    -最近看到了一道面试题,觉得还蛮有意思,就实现了一下。面试题如下:

  • 前端请求并发控制

    题目:请实现如下函数,可以批量请求数据。所有的url地址都在urls参数中,同时可以通过max控制请求的并发度,当...

  • 关于刚才热点帐户的问题,有几个方案可以讨论

    1.并发度控制 同一时刻,对同一账户修改的请求数越多,这个账户的所等待问题就越严重,所谓并发度控制就是要控制同一时...

  • 前端js并发控制实现

    在开发中, 我们经常会遇到多个请求同时进行的需求,请求不多时,我们可以直接使用Promise.all()来进行并发...

  • 数据库并发控制——悲观锁、乐观锁、MVCC

    三种并发控制:悲观并发控制、乐观并发控制、多版本并发控制。 悲观并发控制(又名“悲观锁”,Pessimistic ...

  • MySQL系列之三 -- -并发(MVCC)

    MySQL 并发控制如何实现 MySQL 如何实现高并发? 一 并发控制 抛开MySQL,通过技术上来讨论并发控制...

  • 乐观锁与悲观锁

    乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段 悲观并发控制(悲观锁) 它可以阻止一个...

  • 使用promise实现并发控制

    在前端优化性能的时候, 我们可以考虑使用并发控制比如首页有10个并发请求, 先发送3个, 3个中哪一个响应了, 立...

  • iOS多线程随笔

    1. 多线程的并发控制 1.1 在CGD中快速实现多线程的并发控制 NSOperationQueue来处理并发控制...

  • 你应该了解的MySQL锁分类

    MySQL中的锁 锁是为了解决并发环境下资源竞争的手段,其中乐观并发控制,悲观并发控制和多版本并发控制是数据库并发...

网友评论

      本文标题:前端控制并发度

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