1. Modèle de réseau de fils traditionnel
Avant de comprendre le modèle événementiel Node.js, nous comprenons d'abord le modèle de réseau de threads traditionnel. Après qu'une requête entre dans le serveur Web (IIS, Apache), un thread sera alloué dans le pool de threads pour terminer le traitement de la requête. de manière linéaire et synchrone jusqu'à ce que le traitement de la demande soit terminé et qu'une réponse soit émise, et que le pool de threads soit recyclé une fois terminé.
Cela entraînera les problèmes suivants :
1. En raison du nombre limité de threads dans le pool de threads, des requêtes fréquentes seront en attente et, dans les cas graves, le serveur peut même raccrocher
2. Pour une concurrence élevée, des verrous seront utilisés pour empêcher l'apparition de données sales. Certaines transactions d'E/S peuvent prendre beaucoup de temps, ce qui entraînera une attente de certains threads, ce qui est inefficace
.2. Modèle événementiel
1. Il y a une file d'attente d'événements dans Node.js. Chaque tâche sera placée dans la file d'attente d'événements et une fonction de rappel sera laissée pour traiter les résultats (personnellement, cela ressemble un peu à RunLoop dans). ios) traite la file d'attente des événements dans la tâche jusqu'à ce que la fonction de rappel n'existe plus.
2. En cas de non-blocage, il est placé dans la file d'attente des événements en tant que fonction avec un rappel, et est extrait et exécuté dans le thread de boucle d'événements.
3. En cas de blocage d'E/S pendant l'exécution (lecture de fichiers, interrogation de bases de données, demande de sockets, accès à des services distants, etc.), le thread de la boucle d'événements n'arrêtera pas d'attendre le résultat, mais continuera d'exécuter la file d'attente. . La tâche suivante ne sera pas exécutée dans le thread de boucle d'événement. Lorsqu'une fonction est exécutée, Node.js place les fonctions de rappel dans la file d'attente des événements et leur ordre est déterminé par la rapidité avec laquelle la fonction se termine.
4. Comme mentionné en 1, en cas de blocage d'E/S, le thread de boucle n'attendra pas le résultat, mais exécutera à la place la tâche suivante dans la file d'attente. Alors, qui doit effectuer cette opération d'E/S ? >
Node.js utilise des rappels d'événements pour éviter d'attendre le blocage des E/S et implémente un pool de threads en arrière-plan. Lorsqu'il rencontre une tâche de blocage d'E/S, il obtiendra un thread du pool de threads et placera la fonction et le rappel. dans Exécuté là-bas, la fonction de rappel exécutée sur le thread bloqué peut toujours ajouter des événements à la file d'attente des événements.
Ce qui précède concerne le modèle événementiel Node.js. J'espère qu'il sera utile à l'apprentissage de chacun.