2017-07-20 1 views

Répondre

1

Le modèle d'E/S de Node et de libuv est très similaire à ce que fait nginx en interne.

La bibliothèque libuv utilise une boucle d'événements à un seul thread et des E/S asynchrones non bloquantes. Toutes les fonctions sont synchrones de façon à ce qu'elles soient terminées, mais certaines astuces intelligentes avec des promesses et des générateurs peuvent être utilisées pour faire apparaître qu'elles ne le sont pas (lorsque l'invocation de la fonction génératrice est non bloquante et renvoie l'objet générateur immédiatement et les méthodes de génération telles que .next() sont exécutées), plus la nouvelle syntaxe async/await le rend très pratique. Pour les opérations qui ne peuvent pas être accomplies de manière non bloquante, Node utilise un pool de threads pour exécuter les opérations de blocage dans des threads séparés, mais de manière transparente et n'est jamais exposé au code de l'application écrit en JavaScript (vous devez descendre à C++ pour travailler avec cela directement).

Voir: http://docs.libuv.org/en/v1.x/design.html

Contrairement à E/S réseau, il n'y a pas de fichiers spécifiques à la plate-forme primitives E/S libuv pourrait compter, si l'approche actuelle est de fichier exécuter le blocage des opérations d'E/S dans un pool de threads. [...]

libuv utilise actuellement un pool de threads global sur lequel toutes les boucles peuvent travailler. 3 types d'opérations sont gérées actuellement sur ce bassin:

  • opérations du système de fichiers
  • fonctions DNS (de GetAddrInfo et getnameinfo)
  • code spécifié utilisateur via uv_queue_work()

Voir aussi ces réponses pour plus de détails:

Voir les liens et l'illustration de ces réponses. Il y a beaucoup de ressources à lire sur ce sujet.

+0

Ce sont de bonnes références mais aucune d'entre elles n'aborde spécifiquement le sujet. Permettez-moi de poser une question plus précise. Puisque tout le réseau io fonctionne sur un seul thread dans libuv, pour réaliser async io avec quelque chose lire des événements par exemple, vous devez déléguer la tâche pour le système d'exploitation et lui fournir un tampon défini par l'utilisateur qui serait rempli avec les données de la read op, mais ce serait le modèle du proacteur. Comment libuv obtient-il un effet similaire en utilisant une seule boucle d'événement de réacteur fileté? – Michael

+0

@Michael La plupart des E/S réseau s'exécutent sur un seul therad mais par ex. pas les opérations DNS (getaddrinfo et getnameinfo) et pas les E/S du système de fichiers, donc ce n'est pas aussi clair que cela puisse paraître et aucun modèle théorique unique ne peut être appliqué à 100% à tous les cas de bord que Node doit support sur toutes les plateformes. – rsp

+0

@Michael La première réponse de la liste que j'ai incluse dans la réponse a quelques commentaires que vous pourriez trouver utiles postés par [** saghul **] (https://stackoverflow.com/users/280310/saghul?tab=topactivity) (qui, je suppose, vous donnerait une réponse beaucoup plus détaillée à votre commentaire ici, mais malheureusement, il est seulement possible @ -mentionner quelqu'un dans les commentaires pour répondre où il a déjà commenté). – rsp