日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

前端開發中大并發量如何控制并發數

來源: 責編: 時間:2024-05-07 09:15:44 209觀看
導讀寫在前面最近在進行移動端h5開發,首頁需要加載的資源很多,一個lottie動效需要請求70多張圖片,但是遇到安卓webview限制請求并發數,導致部分圖片請求失敗破圖。當然圖片資源可以做閑時加載和預加載,可以減輕播放動效時資源

PCf28資訊網——每日最新資訊28at.com

寫在前面

最近在進行移動端h5開發,首頁需要加載的資源很多,一個lottie動效需要請求70多張圖片,但是遇到安卓webview限制請求并發數,導致部分圖片請求失敗破圖。當然圖片資源可以做閑時加載和預加載,可以減輕播放動效時資源未加載的問題。PCf28資訊網——每日最新資訊28at.com

PCf28資訊網——每日最新資訊28at.com

上面代碼基本實現了前端并發請求的需求,也基本滿足需求,在生產中其實有很多已經封裝好的庫可以直接使用。比如:p-limit【https://github.com/sindresorhus/p-limit】PCf28資訊網——每日最新資訊28at.com

閱讀p-limit源碼

import Queue from 'yocto-queue';import {AsyncResource} from '#async_hooks';export default function pLimit(concurrency) { // 判斷這個參數是否是一個大于0的整數,如果不是就拋出一個錯誤 if (  !((Number.isInteger(concurrency)  || concurrency === Number.POSITIVE_INFINITY)  && concurrency > 0) ) {  throw new TypeError('Expected `concurrency` to be a number from 1 and up'); } // 創建隊列 -- 用于存取請求 const queue = new Queue(); // 計數 let activeCount = 0; // 用來處理并發數的函數 const next = () => {  activeCount--;  if (queue.size > 0) {   // queue.dequeue()可以理解為[].shift(),取出隊列中的第一個任務,由于確定里面是一個函數,所以直接執行就可以了;   queue.dequeue()();  } }; // run函數就是用來執行異步并發任務 const run = async (function_, resolve, arguments_) => {  // activeCount加1,表示當前并發數加1  activeCount++;  // 執行傳入的異步函數,將結果賦值給result,注意:現在的result是一個處在pending狀態的Promise  const result = (async () => function_(...arguments_))();  // resolve函數就是enqueue函數中返回的Promise的resolve函數  resolve(result);  // 等待result的狀態發生改變,這里使用了try...catch,因為result可能會出現異常,所以需要捕獲異常;  try {   await result;  } catch {}  next(); }; // 將run函數添加到請求隊列中 const enqueue = (function_, resolve, arguments_) => {  queue.enqueue(   // 將run函數綁定到AsyncResource上,不需要立即執行,對此添加了一個bind方法   AsyncResource.bind(run.bind(undefined, function_, resolve, arguments_)),  );  // 立即執行一個異步函數,等待下一個微任務(注意:因為activeCount是異步更新的,所以需要等待下一個微任務執行才能獲取新的值)  (async () => {   // This function needs to wait until the next microtask before comparing   // `activeCount` to `concurrency`, because `activeCount` is updated asynchronously   // when the run function is dequeued and called. The comparison in the if-statement   // needs to happen asynchronously as well to get an up-to-date value for `activeCount`.   await Promise.resolve();   // 判斷activeCount是否小于concurrency,并且隊列中有任務,如果滿足條件就會將隊列中的任務取出來執行   if (activeCount < concurrency && queue.size > 0) {    // 注意:queue.dequeue()()執行的是run函數    queue.dequeue()();   }  })(); }; // 接收一個函數fn和參數args,然后返回一個Promise,執行出隊操作 const generator = (function_, ...arguments_) => new Promise(resolve => {  enqueue(function_, resolve, arguments_); }); // 向外暴露當前的并發數和隊列中的任務數,并且手動清空隊列 Object.defineProperties(generator, {  // 當前并發數  activeCount: {   get: () => activeCount,  },  // 隊列中的任務數  pendingCount: {   get: () => queue.size,  },  // 清空隊列  clearQueue: {   value() {    queue.clear();   },  }, }); return generator;}

整個庫只有短短71行代碼,在代碼中導入了yocto-queue庫,它是一個微型的隊列數據結構。PCf28資訊網——每日最新資訊28at.com

手寫源碼

在進行手撕源碼時,可以借助數組進行簡易的實現:PCf28資訊網——每日最新資訊28at.com

class PLimit {    constructor(concurrency) {        this.concurrency = concurrency;        this.activeCount = 0;        this.queue = [];                return (fn, ...args) => {            return new Promise(resolve => {               this.enqueue(fn, resolve, args);            });        }    }        enqueue(fn, resolve, args) {        this.queue.push(this.run.bind(this, fn, resolve, args));        (async () => {            await Promise.resolve();            if (this.activeCount < this.concurrency && this.queue.length > 0) {                this.queue.shift()();            }        })();    }        async run(fn, resolve, args) {        this.activeCount++;        const result = (async () => fn(...args))();        resolve(result);        try {            await result;        } catch {        }        this.next();    }        next() {        this.activeCount--;        if (this.queue.length > 0) {            this.queue.shift()();        }    }}

小結

在這篇文章中,簡要介紹了為什么要進行并發請求,闡述了使用請求池隊列實現并發請求的設計思路,簡要實現代碼。PCf28資訊網——每日最新資訊28at.com

此外,還閱讀分析了p-limit的源碼,并使用數組進行簡要的源碼編寫,以實現要求。PCf28資訊網——每日最新資訊28at.com

參考文章

  • 【源碼共讀】大并發量如何控制并發數https://juejin.cn/post/7179220832575717435?searchId=20240430092814392DC2208C545E691A26
  • 前端實現并發控制網絡請求https://mp.weixin.qq.com/s/9uq2SqkcMSSWjks0x7RQJg。

本文鏈接:http://www.www897cc.com/showinfo-26-87046-0.html前端開發中大并發量如何控制并發數

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 如何優雅的變更Docker Desktop的鏡像存儲路徑

下一篇: 盤點Lombok的幾個操作,你記住了嗎?

標簽:
  • 熱門焦點
  • 7月安卓手機性價比榜:努比亞+紅魔兩款新機入榜

    7月登場的新機有努比亞Z50S Pro和紅魔8S Pro,除了三星之外目前唯二的兩款搭載超頻版驍龍8Gen2處理器的產品,而且努比亞和紅魔也一貫有著不錯的性價比,所以在本次的性價比榜單
  • 2023年Q2用戶偏好榜:12+256G版本成新主流

    3月份的性能榜、性價比榜和好評榜之后,就要輪到2023年的第二季度偏好榜了,上半年的新機潮已經過去,最明顯的肯定就是大內存和存儲的機型了,另外部分中端機也取消了屏幕塑料支架
  • Automa-通過連接塊來自動化你的瀏覽器

    1、前言通過瀏覽器插件可實現自動化腳本的錄制與編寫,具有代表性的工具就是:Selenium IDE、Katalon Recorder,對于簡單的業務來說可快速實現自動化的上手工作。Selenium IDEKat
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • 零售大模型“干中學”,攀爬數字化珠峰

    文/侯煜編輯/cc來源/華爾街科技眼對于絕大多數登山愛好者而言,攀爬珠穆朗瑪峰可謂終極目標。攀登珠峰的商業路線有兩條,一是尼泊爾境內的南坡路線,一是中國境內的北坡路線。相
  • 慕巖炮轟抖音,百合網今何在?

    來源:價值研究所 作者:Hernanderz&ldquo;難道就因為自己的一個產品牛逼了,從客服到總裁,都不愿意正視自己產品和運營上的問題,選擇逃避了嗎?&rdquo;這一番話,出自百合網聯合創
  • 半導體需求下滑 三星電子DS業務部門今年營業虧損預計超10萬億韓元

    7月17日消息,據外媒報道,去年下半年開始的半導體需求下滑,影響到了三星電子、SK海力士、英特爾等諸多廠商,營收明顯下滑,部分廠商甚至出現了虧損。作為
  • iQOO Neo8 Pro搶先上架:首發天璣9200+ 安卓性能之王

    經過了一段時間的密集爆料,昨日iQOO官方如期對外宣布:將于5月23日推出全新的iQOO Neo8系列新品,官方稱這是一款擁有旗艦級性能調校的作品。隨著發布時
  • 電博會上海爾智家模擬500平大平層,還原生活空間沉浸式體驗

    電博會為了更好地讓參展觀眾真正感受到智能家居的絕妙之處,海爾智家的程傳嶺先生同樣介紹了展會上海爾智家的模擬500平大平層,還原生活空間沉浸式體驗。程傳
Top 主站蜘蛛池模板: 莲花县| 元阳县| 香格里拉县| 丰城市| 安西县| 北海市| 蛟河市| 台南市| 南城县| 玉屏| 建湖县| 海兴县| 颍上县| 丰顺县| 石柱| 舞阳县| 清远市| 大理市| 台中县| 隆林| 昂仁县| 南郑县| 得荣县| 甘孜县| 苍梧县| 南昌县| 桓台县| 扎兰屯市| 鄂尔多斯市| 中阳县| 本溪| 宜川县| 安龙县| 库伦旗| 凤庆县| 安吉县| 清涧县| 海盐县| 双峰县| 财经| 龙口市|