ホームページ >ウェブフロントエンド >jsチュートリアル >多数の Promise で「Promise.all」を使用する場合にメモリ消費を効率的に管理するにはどうすればよいですか?
Promise.all のメモリ消費: 包括的な解決策
この場合、問題はかなりの数 (58k) の Promise があることで発生します。解決する準備ができています。各 Promise がその履行を待つ間、関連する非同期関数と結果データが蓄積され、最終的に過剰なメモリ消費につながります。
効率的な Promise 管理
メモリ使用量を最適化するには、次のことを避けてください。大量の Promise とそのデータをメモリ内に同時に保持します。代わりに、同時操作 (Promise) の数を適切な値 (「X」と呼びます) に制限します。たとえば、レート リミッターで 1 秒あたり 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 中国語 Web サイトの他の関連記事を参照してください。