Maison >interface Web >Questions et réponses frontales >Nodejs est-il multithread ?
Nodejs n'est pas multithread, mais monothread ; nodejs utilise un mode non bloquant asynchrone monothread. En raison du moteur JavaScript, le nœud est monothread par défaut. peuvent être des méthodes d'E/S asynchrones et pilotées par les événements pour obtenir un environnement d'exécution à thread unique et à haute concurrence.
L'environnement d'exploitation de cet article : système Windows 10, nodejs version 12.19.0, ordinateur Dell G3.
node est monothread et adopte un mode non bloquant asynchrone monothread.
En raison du moteur JavaScript, le nœud est monothread par défaut et une application node.js ne peut pas utiliser de ressources multicœurs.
Node.js utilise des E/S asynchrones et événementielles pour implémenter un environnement d'exécution à thread unique et à haute concurrence, et le thread unique signifie qu'une seule chose peut être faite en même temps.
nodejs implémente une exécution asynchrone et non bloquante :
nodejs n'a en fait qu'une exécution js monothread, et les E/S sont évidemment d'autres threads.
Le thread d'exécution js est monothread. Il suffit de transmettre les E/S requises à libuv, de revenir immédiatement pour faire autre chose, puis libuv rappelle à l'heure spécifiée.
En détail, nodejs est d'abord appelé depuis le code js dans les liaisons de nœuds vers le code C/C, puis encapsule quelque chose appelé "objet de requête" dans le code C/C et le transmet à libuv. Certains de ces objets de requête sont similaires aux rappels de fonction qui doivent être exécutés. Exécutez simplement le rappel vers libuv et implémentez le rappel une fois l'exécution terminée.
En bref, le processus général des E/S asynchrones est le suivant.
1. Démarrez l'appel d'E/S
L'utilisateur appelle le module principal Node à partir du code Javascript et transmet les paramètres et la fonction de rappel au module principal
Le module principal Node encapsule les paramètres transmis et la fonction de rappel dans la requête. objet.
Poussez cet objet de requête vers le pool de threads d'E/S pour attendre son exécution ;
L'appel asynchrone Javascript se termine et le thread Javascript continue d'effectuer les opérations suivantes.
2. Exécuter le rappel
Une fois l'opération d'E/S terminée, la fonction de rappel précédemment encapsulée dans l'objet de requête sera récupérée et exécutée pour atteindre l'objectif du rappel Javascript. (Les détails du rappel ici sont expliqués ci-dessous)
Comme vous pouvez le voir ici, nous avons en fait toujours mal compris le thread unique de Node.js.
En fait, un seul thread fait référence à un seul thread dans l'environnement d'exécution Javascript. Node.js n'a pas la possibilité de créer de nouveaux threads lors de l'exécution de Javascript. Les opérations finales réelles sont toujours effectuées dans Libuv et sa boucle d'événements. C'est pourquoi Javascript, un langage monothread, peut implémenter des opérations asynchrones dans Node.js. Les deux ne seront pas en conflit.
Connaissances étendues :
Aperçu du multithreading Node.js
Certaines personnes peuvent dire que bien que Node.js soit monothread, il peut utiliser des événements cycliques (Event Loop)l pour implémenter des tâches d'exécution simultanées. En étudiant son essence, NodeJs utilise en fait deux threads différents, l'un est le thread principal pour le traitement des événements de boucle et l'autre est constitué de threads auxiliaires dans le pool de travailleurs. Les principales fonctions et relations de ces deux threads sont telles qu'indiquées dans la figure
Apprentissage recommandé : "tutoriel vidéo Nodejs"
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!