首頁 > web前端 > js教程 > 使用大量 Promise 的 Promise.all 時如何有效管理記憶體消耗?

使用大量 Promise 的 Promise.all 時如何有效管理記憶體消耗?

DDD
發布: 2024-11-14 21:27:02
原創
660 人瀏覽過

How to Efficiently Manage Memory Consumption When Using `Promise.all` with a Large Number of Promises?

Promise.all 記憶體消耗:綜合解決方案

在這種情況下,問題是由大量(58k)的Promise 引起的準備解決。當每個 Promise 等待實現時,相關的非同步函數和結果資料會累積,最終導致記憶體消耗過多。

高效的 Promise 管理

要最佳化記憶體使用,請避免同時在記憶體中保存大量的 Promise 及其資料。相反,將並發操作(promise)的數量限制為合理的值(稱為“X”)。例如,如果速率限制器允許每秒 20 個請求,則將 X 設為 5 或 10 可能是適當的折衷方案。

實作同時控制

有多種方法執行並發控制:

1.帶有並發選項的Promise.map() :
Bluebird 的Promise.map()提供了一個並發選項,允許指定最大並發操作數。這簡化了管理並發的過程。

2.手動 Promise 管理:
或者,您可以實現自訂程式碼來管理並發。下面的範例示範了這種方法:

function mapConcurrent(items, maxConcurrent, fn) {
    // Limit concurrent operations to `maxConcurrent`
    let inFlightCntr = 0;

    return new Promise((resolve, reject) => {
        function runNext() {
            let i = index;
            let prom = fn(items[index], index++).then(...);
            inFlightCntr++;
            prom.finally(() => { inFlightCntr--; });
            prom.then(...); // Run resolve/reject based on returned promise
        }

        function run() {
            // Process items while count is below the limit
            while (inFlightCntr < maxConcurrent && index < items.length) {
                runNext();
            }

            // Resolve or reject parent promise based on completion
        }

        run();
    });
}
登入後複製

3.佔位符取代:

如果不需要解析的數據,可以用簡單的佔位符替換來加速其垃圾回收,例如數字:

const p = backgroundScheduler.getClanProfile(clanTags[i], true).then(data => {
    return 0;     // Replace resolved value to promote garbage collection
});
promiseArray.push(p);
登入後複製

以上是使用大量 Promise 的 Promise.all 時如何有效管理記憶體消耗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板