Maison > interface Web > js tutoriel > Comment gérer efficacement la consommation de mémoire lors de l'utilisation de « Promise.all » avec un grand nombre de promesses ?

Comment gérer efficacement la consommation de mémoire lors de l'utilisation de « Promise.all » avec un grand nombre de promesses ?

DDD
Libérer: 2024-11-14 21:27:02
original
660 Les gens l'ont consulté

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

Consommation de mémoire Promise.all : une solution complète

Dans ce cas, le problème vient du fait d'avoir un nombre substantiel (58 000) de promesses prêt à être résolu. Alors que chaque promesse attend d'être remplie, les fonctions asynchrones associées et les données de résultats s'accumulent, conduisant finalement à une consommation excessive de mémoire.

Gestion efficace des promesses

Pour optimiser l'utilisation de la mémoire, évitez conserver simultanément un grand nombre de promesses et leurs données en mémoire. Au lieu de cela, limitez le nombre d'opérations simultanées (promesses) à une valeur raisonnable (appelée « X »). Par exemple, si le limiteur de débit autorise 20 requêtes par seconde, définir X sur 5 ou 10 pourrait être un compromis approprié.

Mise en œuvre du contrôle de concurrence

Il existe plusieurs approches pour appliquer le contrôle de concurrence :

1. Promise.map() avec option de concurrence :
Promise.map() de Bluebird fournit une option de concurrence qui permet de spécifier le nombre maximum d'opérations simultanées. Cela simplifie le processus de gestion de la concurrence.

2. Gestion manuelle des promesses :
Vous pouvez également implémenter un code personnalisé pour gérer la concurrence. L'exemple ci-dessous illustre cette approche :

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();
    });
}
Copier après la connexion

3. Remplacement de l'espace réservé :

Si vous n'avez pas besoin des données résolues, vous pouvez accélérer leur garbage collection en les remplaçant par un simple espace réservé, tel qu'un nombre :

const p = backgroundScheduler.getClanProfile(clanTags[i], true).then(data => {
    return 0;     // Replace resolved value to promote garbage collection
});
promiseArray.push(p);
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal