Python et Ruby ont également un tel cadre, mais parce que les bibliothèques contenant du code synchrone sont inévitablement utilisées dans une utilisation réelle, ils n'ont pas grandi. Avant Node.js, la programmation côté serveur de JavaScript était presque vide, donc Node.js a pu établir une bibliothèque de code où tout IO était asynchrone.
Les goulots d'étranglement de la plupart des applications Web se trouvent dans IO, à savoir, lire et écrire des disques, lire et écrire des réseaux et lire et écrire des bases de données. Quel type de stratégie à utiliser pour attendre cette période de temps est devenu le point clé pour améliorer les performances.
Stratégie de PHP: exécutez plusieurs processus, attendez que IO se termine directement. Inconvénients: plusieurs processus consomment plusieurs mémoire, ce qui rend difficile de partager des données entre les processus.
C / C ++ Stratégie commune: exécutez le multi-threading et le programme maintient l'état de verrouillage lui-même. Inconvénients: coût de développement élevé, facile à faire des erreurs et difficile à déboguer.
Python (Tornado): plusieurs demandes sont exécutées à leur tour en un seul processus et passez à une autre demande lorsque je rencontre IO. Inconvénients: pour une seule demande, le temps n'est toujours pas utilisé le plus efficacement.
Qu'est-ce que «utiliser le temps le plus efficacement»? Par exemple, il existe maintenant deux requêtes de base de données non liées. En PHP, on sera généralement exécuté en premier et le second sera exécuté une fois l'exécution terminée (le temps total est A + B). De toute évidence, ce n'est pas le plus efficace. Deux requêtes doivent être exécutées en même temps et le temps est max (a, b).
Le problème avec Python et d'autres langages qui prennent en charge le multithreading est qu'au niveau du langage, il est difficile pour les programmeurs de dire aux machines virtuelles que deux opérations devraient être exécutées simultanément. Même s'il y a un moyen, c'est assez gênant. La plupart des gens sont trop paresseux pour être utilisés (qui ne valent pas la peine d'être utilisés). Parce que Node.js force avec folle à toute l'exécution d'IO de manière asynchrone, les programmeurs Node.js peuvent également le familiariser. En combinaison avec certaines bibliothèques pour améliorer la lisibilité du code (promesse, asynchrones), il peut facilement permettre l'exécution d'opérations non pertinentes en parallèle.
Ce qui précède parle de la mise en œuvre de l'OI asynchrone, alors où sont les avantages de l'OI asynchrone? En fait, l'OI asynchrone ne peut pas réduire comme par magie la pression sur le serveur. Pour ajouter un serveur, vous devez toujours ajouter un serveur, mais IO asynchrone réduira le temps d'une seule demande et supprimera le temps d'attente sans signification en une seule demande. Par conséquent, les demandes traitées dans l'unité n'ont pas changé, mais le temps de traitement pour chaque demande a été réduit. De ce point de vue, le serveur enregistre également certaines ressources - c'est-à-dire maintient la mémoire consommée par chaque connexion demandée.