


Exploration des tâches liées au processeur et liées aux E / S: à l'intérieur de la bibliothèque Libuv dans Node.js
Comprendre les tâches à forte intensité de processeur et les E / S est essentielle pour optimiser les applications et choisir la bonne pile technologique. Ces concepts sont principalement liés aux goulots d'étranglement des performances des applications, ce qui peut aider les développeurs à concevoir des programmes multi-thread et asynchrones très efficaces.
Modèle système
Le système informatique peut être abstrait comme:
<code>输入 (键盘) -> 处理 (CPU) -> 输出 (显示器)</code>l'entrée et la sortie appartiennent à la catégorie d'E / S, et le calcul est traité par le CPU.
Programme unique composé de plusieurs méthodes ou fonctions dans l'ordre ou l'exécution parallèle peut être abstraite comme suit:
<code>输入参数 -> 计算 -> 返回值</code>Un service distribué composé d'un service (cluster) (cluster) en cours dans l'ordre ou parallèle peut être résumé comme:
<code>网络请求 (输入参数) -> 计算 -> 网络响应 (返回值)</code>La demande et la réponse appartiennent à la catégorie d'E / S, et le calcul est traité par le CPU.
Du point de vue du matériel et des logiciels, le système se compose d'un fonctionnement des E / S et d'un calcul du processeur.
tâche dense du CPU
La tâche intensive du CPU est principalement limitée par la vitesse de traitement du processeur central (CPU). Ces tâches nécessitent beaucoup de calculs, et la plupart du temps utilisent le CPU au lieu d'attendre des ressources externes, telles que les E / S de disque ou la communication réseau.
Les caractéristiques de la tâche dense du CPU
- Exigences informatiques élevées
- : Ces tâches impliquent généralement des opérations mathématiques complexes, telles que le codage / le décodage vidéo, le traitement d'image et l'informatique scientifique. Avantages multi-threads : Sur les processeurs multi-oreaux, le traitement parallèle peut améliorer considérablement l'efficacité d'exécution de la tâche intensive du CPU en allouant les charges de travail à plusieurs noyaux.
- Consommation des ressources élevées :: Les tâches à forte intensité de CPU poussent souvent le taux d'utilisation du CPU à près de 100% pendant la période d'exécution.
- Exemples communs
Logiciel de rendu graphique ou de traitement vidéo.
- Exploration de crypto-monnaie.
- Si votre ventilateur d'ordinateur portable s'exécute très fort, il peut être traité avec la tâche à forte intensité de CPU.
- Stratégie d'optimisation de la tâche dense du CPU
Passalized
: Utilisez des processeurs multi-oreaux pour améliorer les performances grâce à l'informatique parallèle.
- Optimisation de l'algorithme
- : Optimiser l'algorithme pour réduire les calculs inutiles. Optimisation du compilateur : Utilisez des compilateurs avec une technologie d'optimisation à haute performance.
- Tâche d'E / S-dense
- Les tâches de tension d'E / S sont principalement limitées par l'opération d'entrée / sortie (E / S), y compris les E / S de disque et la communication réseau. Le goulot d'étranglement de ces tâches est d'attendre que l'opération d'E / S se termine, et non la puissance de calcul.
Caractéristiques des tâches en cas d'E / S
- Exigences d'E / S élevées : Ces tâches lisent et écrivent fréquemment des fichiers ou traitent un grand nombre de demandes de réseau. Les avantages des tâches simultanées
- : des E / S bénéficient des modèles de programmation d'événements et de programmation asynchrones, tels que Node.js non bloquants E / S.
Utilisation faible de CPU : La plupart du temps, la plupart du temps est consacrée à l'attente des opérations externes, le taux d'utilisation du CPU est généralement faible. - Exemples communs
Gérer un grand nombre de serveurs Web et de serveurs de base de données.
- Lire fréquemment et écrire un serveur de fichiers de disque.
- Les applications clients, telles que les clients de messagerie et les applications de médias sociaux, ces applications nécessitent des demandes de réseau fréquentes et une récupération de données.
- Optimisation des tâches à forte intensité d'E / S
Caches
: Utilisez le cache de mémoire pour réduire la demande d'E / S disque.- Programmation asynchrone : Implémentez les opérations d'E / S asynchrones pour éviter l'obstruction, améliorant ainsi la vitesse de réponse et le débit. Optimisation de la gestion des ressources
- : Dé répartition efficace des opérations d'E / S pour minimiser la lecture et l'écriture inutiles. Node.js et les E / S non bloquantes
- Node.js est une implémentation bien connue du modèle d'E / S. Qu'est-ce que les E / S non bloquantes?
Les E / S non bloquantes se réfèrent à l'opération d'entrée / sortie qui ne sera pas obligée de terminer. Cette méthode permet au programme d'effectuer d'autres tâches en attendant l'opération d'E / S.
node.js Comment gérer les E / S non bloquantes?
Node.js exécute JavaScript sur le moteur V8 et utilise la bibliothèque Libuv pour réaliser des E / S non bloquantes et une programmation asynchrone. Les composantes clés des E / S non bloquantes dans Node.js sont:
: Node.js permet le mécanisme central des E / S non bloquantes. Il permet un traitement simultané de la communication réseau, des E / S de fichiers, du fonctionnement de l'interface utilisateur et de l'événement de minuterie.
Appelez la pile
: Toutes les opérations synchrones (telles que l'opération d'obstruction du calcul ou du traitement direct des données) sont exécutées dans la pile. La longue opération dans la pile peut bloquer le programme, provoquant la stagnement du «thread principal».- La file d'attente de rappel : Lorsque l'opération asynchrone est terminée, leur fonction de rappel sera mise dans la file d'attente et attendra l'exécution. Le cycle d'événement continue de vérifier la file d'attente et de déplacer le rappel exécutable vers la pile d'appels pour exécuter. Opération non bloquante
- : Pour l'opération du système de fichiers, Node.js utilise la bibliothèque Libuv pour utiliser l'API Posix non bloquante sous-jacente pour activer la fonction non bloquante. Pour les demandes de réseau, Node.js réalise les E / S de réseau non bloquantes. Considérez l'exemple suivant:
- Dans cet exemple, Fs.Readfile est asynchrone. Node.js continue d'exécuter Console.log ('Next Step') sans attendre la lecture du fichier. Une fois le fichier lu, la fonction de rappel sera mise en file d'attente et finalement exécutée, affichant le contenu du fichier.
- Le thread principal soumet la tâche (telle que la demande de lecture de fichiers) dans la file d'attente de la tâche.
- Le pool de thread récupère et exécute la tâche à partir de la file d'attente.
- Une fois l'achèvement, le thread de travail notifie le thread principal pour effectuer la fonction de rappel.
- UI intuitif, paramètres faciles.
- Expansion facile et haute performance
- Extension automatique pour gérer facilement les hauts et la fusion.
En utilisant le rappel basé sur l'incident, un seul thread peut gérer efficacement plusieurs opérations, ce qui peut considérablement améliorer les performances et l'utilisation des ressources lorsqu'ils traitent des tâches à forte intensité d'E / S.
node.js Le fonctionnement du système de fichiers non bloquants
Lorsque Node.js effectue un fonctionnement du système de fichiers (tel que la lecture des fichiers), il utilise Libuv au lieu d'appeler directement l'API du système de fichiers POSIX. Libuv détermine le moyen le plus efficace d'effectuer ces opérations, tout en empêchant le cycle de l'incident d'être bloqué.
libuv maintient un pool de threads de taille fixe (par défaut: quatre threads) pour effectuer le fonctionnement des E / S de blocage du niveau du système d'exploitation de manière asynchrone. Par conséquent, l'opération d'E / S du fichier est effectuée sur ces threads d'arrière-plan, plutôt que de bloquer la boucle de l'incident principal.
libuv suit Modèle producteur-consommateur , dont:
Cela garantit que le thread principal peut maintenir une légèreté et une réponse rapidement même pendant la période de fonctionnement des E / S lourde.
Choisir la bonne méthode de traitement et la bonne pile technologique est essentielle pour améliorer les performances des applications. Par exemple, Node.js est très adapté au traitement des applications Web de tendance d'E / S car il dispose de modèles d'E / S non bloquants qui peuvent gérer efficacement un grand nombre de demandes de réseau simultanées sans consommation excessive de ressources de thread. Au contraire, pour la tâche à forte intensité de CPU, l'utilisation de langage et de plates-formes multi-thread (telles que Java, C ou GO) peut utiliser des capacités de traitement CPU multi-ore.
Leapcell est utilisé pour l'hébergement Web, les tâches asynchrones et une nouvelle génération sans plate-forme de serveur pour redis:
Prise en charge multi-languageUtilisez Node.js, Python, Go ou Rust pour le développement.
- Déploiement gratuit de projets illimités
Payez simplement pour les demandes d'utilisation, il n'y a pas de frais.
Avantages de coûts inégalésPar exemple: 25 $ prend en charge 6,94 millions de demandes, avec un temps de réponse moyen de 60 millisecondes.
- Expérience des développeurs simplifiés
Pipeline CI / CD complètement automatisé et intégration Gitops. Les indicateurs de temps réel et les enregistrements de journal fournissent des informations opérationnelles.
Apprenez plus d'informations dans le document!
Lisez notre blog
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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Il existe trois façons courantes d'initier des demandes HTTP dans Node.js: utilisez des modules intégrés, Axios et Node-Fetch. 1. Utilisez le module HTTP / HTTPS intégré sans dépendances, ce qui convient aux scénarios de base, mais nécessite un traitement manuel de la couture des données et de la surveillance des erreurs, tels que l'utilisation de https.get () pour obtenir des données ou envoyer des demandes de post via .write (); 2.AXIOS est une bibliothèque tierce basée sur la promesse. Il a une syntaxe concise et des fonctions puissantes, prend en charge l'async / attendre, la conversion JSON automatique, l'intercepteur, etc. Il est recommandé de simplifier les opérations de demande asynchrones; 3.Node-Fetch fournit un style similaire à la récupération du navigateur, basé sur la promesse et la syntaxe simple

Les types de données JavaScript sont divisés en types primitifs et types de référence. Les types primitifs incluent la chaîne, le nombre, le booléen, le nul, un non défini et le symbole. Les valeurs sont immuables et les copies sont copiées lors de l'attribution des valeurs, de sorte qu'elles ne se affectent pas; Les types de référence tels que les objets, les tableaux et les fonctions stockent les adresses de mémoire, et les variables pointant vers le même objet s'afferchent mutuellement. Le typeof et l'instance de OFF peuvent être utilisés pour déterminer les types, mais prêtent attention aux problèmes historiques de typeofnull. Comprendre ces deux types de différences peut aider à écrire un code plus stable et fiable.

La méthode Filter () dans JavaScript est utilisée pour créer un nouveau tableau contenant tous les éléments de test de passage. 1.Filter () ne modifie pas le tableau d'origine, mais renvoie un nouveau tableau qui répond aux éléments conditionnels; 2. La syntaxe de base est array.filter ((élément) => {returnCondition;}); 3. Le tableau d'objets peut être filtré par valeur d'attribut, comme le filtrage des utilisateurs de plus de 30 ans; 4. Prise en charge du filtrage multi-conditions, comme remplir les conditions d'âge et de longueur de nom en même temps; 5. Peut gérer les conditions dynamiques et passer les paramètres du filtre dans les fonctions pour réaliser un filtrage flexible; 6. Lorsque vous l'utilisez, veillez à retourner les valeurs booléennes pour éviter de retourner des tableaux vides et combinez d'autres méthodes pour obtenir une logique complexe telle que la correspondance de chaînes.

Dans JavaScript, vérifiez si un tableau contient une certaine valeur. La méthode la plus courante est Inclut (), qui renvoie une valeur booléenne et la syntaxe est Array.Cuecludes (ValueToFind), par exemple les fruits.Cuels («banane») Renvoie vrai; S'il doit être compatible avec l'ancien environnement, utilisez l'indexof (), comme nombres.indexof (20)! == - 1 Renvoie True; Pour les objets ou les données complexes, une méthode () doit être utilisée pour une comparaison approfondie, telles que les utilisateurs.Some (user => user.id === 1) renvoie true.

Pour gérer les erreurs dans les fonctions asynchrones, utilisez Try / Catch, gérez-les dans la chaîne d'appels, utilisez la méthode .catch () et écoutez les événements non performisés. 1. Utiliser Try / Catch pour attraper les erreurs est la méthode recommandée, avec une structure claire et peut gérer les exceptions en attente; 2. Les erreurs de traitement dans la chaîne d'appels peuvent être une logique centralisée, qui convient aux processus en plusieurs étapes; 3. Utilisez .Catch () pour attraper des erreurs après avoir appelé la fonction asynchrone, qui convient aux scénarios de combinaison de promesses; 4. Écoutez les événements de l'abri de la Fixation pour enregistrer les refus non performes comme la dernière ligne de défense; Les méthodes ci-dessus garantissent conjointement que les erreurs asynchrones sont correctement capturées et traitées.

La clé pour traiter les problèmes de fuseau horaire JavaScript est de choisir la bonne méthode. 1. Lorsque vous utilisez des objets de date native, il est recommandé de stocker et de transférer dans le temps UTC et de le convertir au fuseau horaire local de l'utilisateur lors de l'affichage; 2. Pour les opérations de fuseau horaire complexes, le moment-temps peut être utilisé, qui prend en charge la base de données du fuseau horaire IANA et offre des fonctions de mise en forme et de conversion pratiques; 3. Si vous avez besoin de localiser l'heure d'affichage et que vous ne souhaitez pas introduire des bibliothèques tierces, vous pouvez utiliser intl.datetimeFormat; 4. Il est recommandé au jour moderne de la solution légère et du plug-in de solution légère et de fuseau horaire et UTC, qui a une API concise, de bonnes performances et prend en charge la conversion du fuseau horaire.

Virtual Dom est un concept de programmation qui optimise les mises à jour réelles DOM. En créant une structure d'arbre correspondant au DOM réel en mémoire, il évite le fonctionnement fréquent et direct du DOM réel. Son principe de base est: 1. Générer un nouveau DOM virtuel lorsque les données changent; 2. Trouvez la plus petite différence entre les nouveaux et les anciens doms virtuels; 3. Mise à jour par lots du DOM réel pour réduire les frais généraux de réarrangement et de redémarrage. De plus, l'utilisation d'une clé stable unique peut améliorer l'efficacité de comparaison de la liste, tandis que certains cadres modernes ont adopté d'autres technologies pour remplacer le DOM virtuel.

FunctionalProgrammingInjavascriptEmphasizesClean, prédictioncodethroughcoreConcepts.1.purefonctionnement de la recherche de nom
