Python und Ruby verfügen ebenfalls über solche Frameworks, aber da Bibliotheken, die Synchronisationscode enthalten, bei der tatsächlichen Verwendung zwangsläufig verwendet werden, waren sie vor Node.js fast leer, also war es bei Node.js so in der Lage, eine Codebasis aufzubauen, in der alle E/A asynchron sind.
Der Engpass der meisten Webanwendungen ist IO, also das Lesen und Schreiben von Datenträgern, das Lesen und Schreiben von Netzwerken sowie das Lesen und Schreiben von Datenbanken. Welche Strategie zum Abwarten dieses Zeitraums verwendet werden soll, wird zum entscheidenden Punkt für die Leistungsverbesserung.
PHPs Strategie: Führen Sie mehrere Prozesse aus und warten Sie direkt auf den Abschluss von IO. Nachteile: Mehrere Prozesse verbrauchen mehrere Kopien des Speichers, was den Datenaustausch zwischen Prozessen erschwert.
Die übliche C/C-Strategie: In mehreren Threads ausführen und das Programm behält den Sperrstatus selbst bei. Nachteile: hohe Entwicklungskosten, fehleranfällig und schwer zu debuggen.
Python (Tornado): Mehrere Anfragen werden nacheinander in einem einzigen Prozess ausgeführt und bei E/A-Angriffen wird auf eine andere Anfrage umgeschaltet. Nachteile: Immer noch nicht die effizienteste Zeitnutzung für eine einzelne Anfrage.
Was ist „die effizienteste Zeitnutzung“? Beispielsweise gibt es in PHP zwei unabhängige Datenbankabfragen. Eine wird normalerweise zuerst ausgeführt, und die zweite wird dann ausgeführt, nachdem die Ausführung abgeschlossen ist (die Gesamtzeit ist offensichtlich nicht die effizienteste, und beide Abfragen). sollte gleichzeitig ausgeführt werden. ist max(a, b).
Das Problem bei Python und anderen Sprachen, die Multithreading unterstützen, besteht darin, dass es für Programmierer auf Sprachebene schwierig ist, der virtuellen Maschine mitzuteilen, dass zwei Vorgänge gleichzeitig ausgeführt werden sollen Allerdings ist es ziemlich mühsam und die meisten Leute sind zu faul, es zu benutzen (es lohnt sich auch nicht). Und da Node.js hektisch die asynchrone Ausführung aller E/A erzwingt, können Node.js-Programmierer auch damit vertraut sein. Mit einigen Bibliotheken, die die Lesbarkeit des Codes verbessern (Promise, Async), können sie problemlos dafür sorgen, dass nicht verwandte Vorgänge parallel ausgeführt werden . .
Die Implementierung von asynchronem IO wurde oben besprochen. Was sind also die Vorteile von asynchronem IO? Tatsächlich kann asynchrones E/A den Druck auf den Server nicht auf magische Weise reduzieren. Wenn Sie einen Server hinzufügen müssen, müssen Sie dennoch einen Server hinzufügen Einzelanfrage. Daher hat sich die Anzahl der pro Zeiteinheit verarbeiteten Anfragen nicht geändert, aber die Bearbeitungszeit jeder Anfrage hat sich verringert. Aus dieser Perspektive spart der Server auch einige Ressourcen, d. h. den Speicher, der durch die Aufrechterhaltung der Verbindung für jede Anfrage verbraucht wird.