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中文網其他相關文章!