Rumah >hujung hadapan web >tutorial js >Bagaimana untuk Menguruskan Penggunaan Memori Dengan Cekap Apabila Menggunakan `Promise.all` dengan Jumlah Janji yang Banyak?

Bagaimana untuk Menguruskan Penggunaan Memori Dengan Cekap Apabila Menggunakan `Promise.all` dengan Jumlah Janji yang Banyak?

DDD
DDDasal
2024-11-14 21:27:02662semak imbas

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

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn