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(); }); }
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);
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!