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. Une application nodejs ne peut pas utiliser de ressources multicœurs et peut utiliser. méthode « E/S » asynchrone et événementielle 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.
Le nœud est monothread et utilise le 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. Le thread unique signifie qu'une seule chose peut être effectuée en même temps.
Nodejs implémente de manière asynchrone et non bloquante :
Dans nodejs, seule l'exécution de js est en fait monothread, et les E/S sont évidemment d'autres threads.
Le thread d'exécution js est monothread. Tant que les E/S requises sont transmises à libuv, il reviendra immédiatement pour faire autre chose, puis libuv rappellera à l'heure spécifiée.
En détail, nodejs l'appelle d'abord du 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 fonctions qui doivent être exécutés. Exécutez simplement le rappel vers libuv et implémentez le rappel après l'exécution.
En bref, le processus général des E/S asynchrones est le suivant.
1. Démarrez un appel d'E/S
L'utilisateur appelle le module principal Node à partir du code Javascript et transmet les paramètres et les fonctions de rappel au module principal.
Le module principal Node encapsule les paramètres transmis et les fonctions de rappel dans l'objet de requête.
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 est 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)
On peut voir à partir d’ici que nous avons 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, et 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.
Élargissez vos connaissances :
Présentation du multithreading Node.js
Certaines personnes peuvent dire que bien que Node.js soit monothread, il peut utiliser des événements cycliques (Event Loop) 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 des threads auxiliaires dans le pool de travailleurs. Les principales fonctions et relations de ces deux threads sont les suivantes :
Apprentissage recommandé : "tutoriel vidéo nodejs"
Ce qui précède indique si nodejs est multithread. Pour plus d'informations, veuillez prêter attention aux autres articles connexes sur ce site !