Maison > interface Web > js tutoriel > Comment puis-je implémenter correctement des fonctions non bloquantes dans Node.js ?

Comment puis-je implémenter correctement des fonctions non bloquantes dans Node.js ?

Patricia Arquette
Libérer: 2024-12-09 10:10:09
original
358 Les gens l'ont consulté

How Can I Correctly Implement Non-Blocking Functions in Node.js?

Implémentation correcte des fonctions non bloquantes dans Node.js

Malgré l'idée fausse, le simple fait d'envelopper du code dans une promesse ne le rend pas non -blocage. La fonction d’exécuteur Promise, étant de nature synchrone, bloque l’exécution. C'est la raison du délai observé dans le code fourni avant d'imprimer les lignes suivantes.

Le problème avec le code fourni

Le code semble initialement non bloquant , en utilisant une promesse pour renvoyer le résultat du longRunningFunc intensif en calcul. Cependant, lors de l'exécution, nous observons un délai avant l'impression des deuxième et troisième lignes, indiquant que le programme attend la résolution de la promesse.

Vrai code non bloquant dans Node.js

Pour créer du code véritablement non bloquant dans Node.js, nous disposons de plusieurs options :

  • Processus enfants : Exécutez le code dans un processus enfant distinct et recevez une notification asynchrone à la fin.
  • Worker Threads (Node. js v11 ): Tirez parti des Worker Threads expérimentaux introduits dans Node.js v11.
  • Modules complémentaires de code natif : Développez des modules complémentaires natifs personnalisés à l'aide de threads libuv ou au niveau du système d'exploitation.
  • Exploitation des API asynchrones existantes : S'appuyer sur les API asynchrones existantes, en évitant l'exécution prolongée du code dans l'ensemble thread.

Révision de l'exemple

Bien qu'encapsuler le code dans une promesse ne soit pas suffisant pour un comportement non bloquant, nous pouvons utiliser setTimeout() pour planifier la boucle for pour une exécution ultérieure :

function longRunningFunc(val, mod) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      let sum = 0;
      for (let i = 0; i < 100000; i++) {
        for (let j = 0; j < val; j++) {
          sum += i + j % mod;
        }
      }
      resolve(sum);
    }, 10);
  });
}
Copier après la connexion

Cette approche décale le timing de la boucle for, donnant l'apparence de non-blocage comportement. Cependant, il est important de noter que la boucle for s'exécute toujours de manière synchrone une fois planifiée. Pour obtenir un véritable code non bloquant, nous devrons utiliser l'une des techniques décrites précédemment.

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal