Janji.semua Penggunaan Memori: Penyelesaian Komprehensif
Dalam kes ini, isu timbul kerana mempunyai sejumlah besar (58k) janji sedia untuk diselesaikan. Memandangkan setiap janji menunggu untuk dipenuhinya, fungsi async yang berkaitan dan data hasil terkumpul, akhirnya membawa kepada penggunaan memori yang berlebihan.
Pengurusan Janji yang Cekap
Untuk mengoptimumkan penggunaan memori, elakkan memegang sejumlah besar janji dan data mereka dalam ingatan secara serentak. Sebaliknya, hadkan bilangan operasi serentak (janji) kepada nilai yang munasabah (dirujuk sebagai "X"). Contohnya, jika pengehad kadar membenarkan 20 permintaan sesaat, menetapkan X kepada 5 atau 10 boleh menjadi kompromi yang sesuai.
Melaksanakan Kawalan Konkurensi
Terdapat pelbagai pendekatan untuk menguatkuasakan kawalan konkurensi:
1. Promise.map() dengan Concurrency Option:
Bluebird's Promise.map() menyediakan pilihan concurrency yang membenarkan menentukan bilangan maksimum operasi serentak. Ini memudahkan proses mengurus konkurensi.
2. Pengurusan Janji Manual:
Sebagai alternatif, anda boleh melaksanakan kod tersuai untuk mengurus konkurensi. Contoh di bawah menunjukkan pendekatan ini:
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. Penggantian Pemegang Tempat:
Jika anda tidak memerlukan data yang diselesaikan, anda boleh mempercepatkan kutipan sampahnya dengan menggantikannya dengan pemegang tempat yang mudah, seperti nombor:
const p = backgroundScheduler.getClanProfile(clanTags[i], true).then(data => { return 0; // Replace resolved value to promote garbage collection }); promiseArray.push(p);
Atas ialah kandungan terperinci Bagaimana untuk Menguruskan Penggunaan Memori Dengan Cekap Apabila Menggunakan `Promise.all` dengan Jumlah Janji yang Banyak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!