Henry-Diasa / awesome_interview_question

总结前端面试题,更贴近于实战,而非背诵的八股文。
11 stars 0 forks source link

最大并发数 #494

Open Henry-Diasa opened 1 year ago

Henry-Diasa commented 1 year ago
/*
 * 控制并发数
 * @param {array} list - 请求列表
 * @param {number} num - 最大并发数
 */
function control(list, num) {
  function fn() {
    if (!list.length) return;
    // 从任务数 和 num 中 取最小值,兼容并发数num > list.length的情况
    let max = Math.min(list.length, num);
    for (let i = 0; i < max; i++) {
      let f = list.shift();
      num--;
      // 请求完成后,num++
      f().finally(() => {
        num++;
        fn();
      });
    }
  }
  fn();
}
Henry-Diasa commented 1 year ago
// countLimit 是一个函数,执行fn,执行的并发度是 2,返回一个 Promise
let countLimit = pLimit(fn, 2)
countLimit(a) // 立即执行
countLimit(b) // 立即执行
countLimit(c) // 前两个函数执行完再执行

// 求实现函数 pLimit
function pLimit(fn, times) {  
      let fns = []    
      function executeFns() {        
        if (fns.length && times) { 
           const f = fns.shift() ;           
           times--;            
           f().finally(() => {                
            times++;                
            executeFns()            
        })        
    }    }    
    function inner(...args) {        
        fns.push(() => fn.apply(this, args));        
        executeFns()    
    }
    return inner
    }; 

    let countLimit = pLimit(function (times) { 
        console.log('test', times);   
        return new Promise((resolve) => setTimeout(resolve, times * 1000))
    }, 2);
    countLimit(2);
    countLimit(3);
    countLimit(2);
    countLimit(3);
    countLimit(2);
    countLimit(1)