Dieses Mal werde ich Ihnen das Ausführungsprinzip von Node.js-Code vorstellen. Was sind die Vorsichtsmaßnahmen beim Ausführen von Node.js-Code? Das Folgende ist ein praktischer Fall, schauen wir uns das an.
Nachdem eine Software erfolgreich heruntergeladen und installiert wurde, handelt es sich tatsächlich nur um einen Haufen Maschinencode, der auf der Festplatte unseres Computers gespeichert ist, also um einen Haufen exe-Dateien, die wir sehen können. Manche Software ist groß und enthält möglicherweise eine Reihe von DLL-Dateien.
Wir haben zwei Möglichkeiten, diese Software auszuführen:
Die meisten Softwareprogramme wie QQ, Feiqiu und der Chrome-Browser können durch Doppelklicken ausgeführt werden.
Manche Software muss in der Befehlszeile ausgeführt werden, wie zum Beispiel unser node.js.
Wenn eine Software ausgeführt wird, erstellt unser Betriebssystem einen entsprechenden Prozess. Es kann verstanden werden, dass es sich bei dem Prozess um lebende Software handelt.
Prozesse und Threads
Der Kern des Computers ist die CPU, die alle Rechenaufgaben übernimmt. Es ist wie eine Fabrik, die ständig in Betrieb ist. Unter der Annahme, dass die Leistung der Fabrik begrenzt ist, kann sie jeweils nur von einer Werkstatt genutzt werden. Mit anderen Worten: Wenn eine Werkstatt ihre Arbeit aufnimmt, müssen andere Werkstätten ihre Arbeit einstellen. Der Sinn dahinter ist, dass eine einzelne CPU jeweils nur eine Aufgabe ausführen kann. Der Prozess ist wie die Werkstatt einer Fabrik. Er stellt eine einzelne Aufgabe dar, die die CPU jederzeit ausführen kann, und andere Prozesse befinden sich in einem nicht ausgeführten Zustand. In einer Werkstatt können viele Arbeiter zusammenarbeiten, um eine Aufgabe zu erledigen. Threads sind wie Arbeiter in einem Workshop. Ein Prozess kann mehrere Threads umfassen. Der Raum in der Werkstatt wird von den Arbeitern geteilt. Beispielsweise können viele Räume von jedem Arbeiter betreten und verlassen werden. Dies bedeutet, dass der Speicherraum eines Prozesses gemeinsam genutzt wird und jeder Thread diese gemeinsamen Erinnerungen nutzen kann. Allerdings ist die Größe jedes Zimmers unterschiedlich, z. B. die Toilette. Wenn sich jemand darin aufhält, können andere Personen keinen Zutritt haben. Das bedeutet, dass andere Threads warten müssen, bis der Vorgang abgeschlossen ist, bevor sie diesen Speicher verwenden können, wenn ein Thread gemeinsam genutzten Speicher verwendet.
Eine einfache Möglichkeit, andere am Betreten zu hindern, besteht darin, ein Schloss an der Tür anzubringen. Personen, die später ankommen, sehen das Schloss und warten darauf, dass sich das Schloss öffnet hineingehen. Dies wird als gegenseitige Ausschlusssperre bezeichnet.
Warum ist JavaScript Single-Threaded?
Ein Hauptmerkmal der JavaScript-Sprache ist, dass sie Single-Threaded ist, was bedeutet, dass sie jeweils nur eine Sache ausführen kann. Warum kann JavaScript also nicht mehrere Threads haben? Dadurch kann die Effizienz verbessert werden.
Der einzelne Thread von JavaScript hängt mit seinem Zweck zusammen. Als Browser-Skriptsprache besteht der Hauptzweck von JavaScript darin, mit Benutzern zu interagieren und das DOM zu manipulieren. Dies legt fest, dass es nur Single-Threaded sein kann, da es sonst zu sehr komplexen Synchronisationsproblemen kommt. Angenommen, JavaScript verfügt über zwei Threads gleichzeitig. Ein Thread fügt Inhalt zu einem bestimmten DOM-Knoten hinzu und der andere Thread löscht diesen Knoten. Welchen Thread sollte der Browser in diesem Fall verwenden?
Um Komplexität zu vermeiden, ist JavaScript seit seiner Geburt Single-Threaded. Dies ist zum Kernmerkmal dieser Sprache geworden und wird sich auch in Zukunft nicht ändern.
JavaScript ist Single-Threaded, obwohl es Worker, Cluster usw. gibt, die Multithreading implementieren können, diese werden jedoch zum Erstellen von Threads mit eingeschränkten Funktionen verwendet und werden daher unserer Meinung nach immer noch vom Hauptthread gesteuert JavaScript Es ist Single-Threaded.
Darüber hinaus müssen wir verstehen, dass JavaScript Single-Threaded ist, was nicht bedeutet, dass Node.js auch Single-Threaded ist. Nachdem Node.js eine Instanz ausgeführt hat, handelt es sich um einen Einzelprozess und mehrere Threads. Es gibt einen Thread darin. Die V8-Engine ist für das Parsen von JavaScript verantwortlich, und einige Threads sind für libuv verantwortlich, was wir als Ereignisschleife verstehen.
Wie man IO versteht:
I steht für Eingabe, Eingabe: wie das Lesen einer Datei, Initiieren einer Ajax-Anforderung für Daten
O steht für Ausgabe, Ausgabe: wie das Schreiben einer Datei
Synchron vs. Asynchron
Wie das Folgende, bei dem es nicht um das Lesen und Schreiben von Dateien, Netzwerkanforderungen oder Timern geht, handelt es sich ausschließlich um synchronen Code:
var a = 1;var b = 2;function fn(){}
Das Folgende ist asynchroner Code:
fs.readFile('./a.js',callback); fs.writeFile('./b.js',callback);
Einschließlich einer Reihe von Maus-, Tastaturereignissen, Ajax usw., die wir auf der Browserseite sehen.
Die meisten asynchronen Objekte in Node.js werden vom Ereignisobjekt event.eventEmitter geerbt
Verstehen Sie den Mechanismus, mit dem Node.js Code ausführt
Wir können Node Imagine einsetzen Der .js-Prozess ist wie ein Restaurant:
Der Chef stellt den JavaScript-Hauptthread dar. Er ist ständig damit beschäftigt, den Synchronisationscode im Hauptthread auszuführen, bis die Ausführung abgeschlossen ist.
//同步代码var a = 1;//同步代码var b = 2;//异步代码fs.readFile('./a.js',function(err,data){ if(err)throw data; });//同步代码var c = 3;//异步代码setTimeout(function(){ },200);//同步代码console.log(a + b + c);//同步代码function fn(){ console.log('abc'); }//异步代码fs.writeFile('./b.js',myData,function(err){ if(err)throw err; });
Zum Beispiel wird der Code wie oben von oben nach unten ausgeführt, wenn er auf synchronen Code trifft, wird er jedoch direkt an den Chef übergeben, um ihn zu vervollständigen wird zu diesem Zeitpunkt nicht ausgeführt, sondern wird wie ein neuer Gast an unseren Kellner übergeben, und der Kellner registriert das vom Gast bestellte Gericht, was gleichbedeutend damit ist, diesen asynchronen Code als Ereignis zu behandeln und in unserer Ereigniswarteschlange aufzuzeichnen .
Wenn fast alle Synchronisierungscodes ausgeführt wurden, ist der Hauptthread inaktiv. Zu diesem Zeitpunkt wird unser Ereignisschleifenthread gestartet und dieser Ereignisschleifenthread beginnt zu prüfen, welche Gäste vom Kellner registriert wurden. Nachdem wir die Gerichte bestellt haben, beginnen wir damit, ihre Gerichte nacheinander in der Reihenfolge ihrer Priorität zu braten, d. h. mit der Ausführung unseres asynchronen Codes, da es viele Gäste gibt und die Anforderungen jedes Gastes unterschiedlich sind, z asynchroner Code, wie Timer, Dateilesen, Dateiabruf und Netzwerkanforderungen, daher verfügt Node.js über eine Reihe von Thread-Pools, um diese asynchronen Codes zu verarbeiten.
Wenn die asynchrone Ausführung eines Threads im Thread-Pool abgeschlossen ist, entspricht dies dem Abschluss des Ereignisses, und die dem Ereignis entsprechende Rückruffunktion wird hinter dem Hauptthread in die Warteschlange gestellt . .
Sobald im Hauptthread neuer Code ausgeführt werden muss, beginnt der Chef mit der Arbeit, sobald er sieht, dass es etwas zu tun gibt.
Wenn der Code, der der im Hauptthread ausgeführten Rückruffunktion entspricht, neuen asynchronen Code generiert, wird er in der Ereignisschleife registriert.
Bis zu einem bestimmten Zeitpunkt werden alle Ereignisse in der Ereigniswarteschlange ausgeführt und der Thread-Pool wird langsam geleert.
node.js ruft process.exit() auf und das Betriebssystem zerstört den aktuellen node.js-Prozess.
Im Grunde reicht es aus, das oben Gesagte zu verstehen. Gehen wir noch einen Schritt weiter:
Wenn wir an den Punkt kommen, an dem wir Netzwerkprogrammierung lernen, wissen wir, dass wir einen Servercontainer kennen, es sei denn, wir Ergreifen Sie die Initiative. Verwenden Sie STRG + C, um den aktuellen Prozess zu beenden. Andernfalls wird auf die Clientverbindung gewartet und die entsprechende Verarbeitung gemäß der entsprechenden Route durchgeführt.
Wie verstehst du das?
Erinnern wir uns an die API, die wir in jQuery gelernt haben. Es gibt zwei Möglichkeiten, Ereignisse zu überwachen:
einmalige Überwachung
unbegrenzte Überwachung
Wir Kann so verstanden werden: Die meisten Dateioperationen, Ajax usw. müssen tatsächlich nur einmal ausgeführt werden und werden nicht ein zweites Mal ausgeführt. Sie entsprechen einem Ereignismodell eines Typs.
Wenn es sich jedoch um Netzwerkprogrammierung wie Socket, http usw. handelt, ist dies gleichbedeutend mit einer unbegrenzten Überwachung.
Ich glaube, dass Sie die Methode beherrschen, nachdem Sie den Fall in diesem Artikel gelesen haben. Weitere spannende Informationen finden Sie in anderen verwandten Artikeln auf der chinesischen PHP-Website.
Empfohlene Lektüre:
Das Konzept der Verwendung unabhängiger Bereiche in Winkel
Detaillierte Erläuterung der Verwendung von $apply( ) in AngularJS
Das obige ist der detaillierte Inhalt vonWie Node.js-Code ausgeführt wird. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!