资讯专栏INFORMATION COLUMN

在限定并发数下用 Promise 并发完成请求

laoLiueizo / 1642人阅读

摘要:这是一道用来熟练的题目,给定个,要求使用在限定并发数为的情况下完成请求。

这是一道用来熟练Promise的题目,给定N个URL,要求使用Promise在限定并发数为M(M < N) 的情况下完成请求。

class PromisePool {
  constructor(max, fn) {
    this.max = max; // 最大并发数
    this.fn = fn;   // 自定义的请求函数
    this.pool = []; // 并发池
    this.urls = []; // 剩余的请求地址
  }

  start(urls) {
    this.urls = urls;
    // 先循环把并发池塞满
    while (this.pool.length < this.max) {
      let url = this.urls.shift();
      this.setTask(url);
    }
    // 利用Promise.race 方法来获得并发池中某任务完成的信号
    let race = Promise.race(this.pool);
    return this.run(race);
  }

  run(race) {
    race
      .then(res => {
        // 每当并发池跑完一个任务,就再塞入一个任务
        let url = this.urls.shift();
        this.setTask(url);
        return this.run(Promise.race(this.pool));
      });
  }
  setTask(url) {
    if (!url) return;
    let task = this.fn(url);
    this.pool.push(task); // 将该任务推入pool并发池中
    console.log(`x1B[43m ${url} 开始,当前并发数:${this.pool.length}`);
    task.then(res => {
      // 请求结束后将该Promise任务从并发池中移除
      this.pool.splice(this.pool.indexOf(task), 1);
      console.log(`x1B[43m ${url} 结束,当前并发数:${this.pool.length}`);
    });
  }
}

// test
const URLS = [
  "bytedance.com",
  "tencent.com",
  "alibaba.com",
  "microsoft.com",
  "apple.com",
  "hulu.com",
  "amazon.com"
];
// 自定义请求函数
var requestFn = url => {
  return new Promise(resolve => {
    setTimeout(_ => {
      resolve(`任务 ${url} 完成`);
    }, 1000*dur++)
  }).then(res => {
    console.log("外部逻辑 ", res);
  })
}

const pool = new PromisePool(3, requestFn); // 并发数为3
pool.start(URLs);

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106935.html

相关文章

  • 15 行代码实现并发控制(javascript)

    摘要:而爬虫一般用多线程来控制并发,然而如果是爬虫,由于其单线程无阻塞性质以及事件循环机制,一般不用多线程来控制并发当然也可以实现多线程,此处非重点不再多讲,而是更加简便地直接在代码层级上实现并发。下面我们用行代码实现一个并发控制的函数。 前言 首发于 github blog 做过爬虫的都知道,要控制爬虫的请求并发量,其实也就是控制其爬取频率,以免被封IP,还有的就是以此来控制爬虫应用运...

    gyl_coder 评论0 收藏0
  • 小程序图片合成:异步并发渲染→同步阻塞渲染

    摘要:故事开始了,小程序图片合成真机测试时,会报错。所以只能将异步并发改为同步阻塞式渲染。 showImg(https://segmentfault.com/img/remote/1460000013228074); 故事开始了,小程序canvas图片合成 真机测试时,会报错:getImageInfo failed 。也就是说,我这边异步请求50张图片,每张图片都是通过getImageInf...

    zhoutao 评论0 收藏0
  • 微服务治理之如何优雅应对突发流量洪峰

    摘要:以上两点同时满足时则说明服务处于高负载状态,则进行自适应降载。如果放行则返回,等待业务侧执行回调函数执行指标统计。当前系统的最大并发数窗口单位时间内的最大通过数量窗口单位时间内的最小响应时间。 为什么需要降载微服务集群中,调用链路错综复杂,作为服务提供者需要有一种保护自己的机制,防止调用方无脑调用压垮自己,保证...

    Jeffrrey 评论0 收藏0
  • node.js 爬取招聘信息分析各职业钱途(爬虫+动态IP代理+数据可视化分析)

    摘要:成功爬取了拉钩网上多个招聘岗位的具体信息后,数据可视化并得出分析结果如下从整体看,北上广深杭这五个城市前端工程师招聘岗位,北京是遥遥领先,是深圳的两倍,是广州的三倍,其次到上海,深圳,杭州,广州居末。 前前言 本文首发于 github blog 不想看爬虫过程只想看职位钱途数据分析请看这里:前端招聘岗位分析C++招聘岗位分析JAVA招聘岗位分析PHP招聘岗位分析Python招聘岗位分析...

    546669204 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<