Heim  >  Artikel  >  Web-Frontend  >  Eine ausführliche Analyse des Node.js-Ereignisses loop_node.js

Eine ausführliche Analyse des Node.js-Ereignisses loop_node.js

WBOY
WBOYOriginal
2016-05-16 15:24:161435Durchsuche

Node.js ist eine Einzelprozess- und Einzelthread-Anwendung, unterstützt jedoch Parallelität durch Ereignisse und Rückrufe, sodass die Leistung sehr hoch ist.

(Quelle: Javascript ist Single-Threaded und asynchron, aber diese Sprachen haben ein gemeinsames Merkmal: Sie sind ereignisgesteuert. Die Ereignisse, die sie antreiben, stammen von einer heterogenen Plattform.)

Jede API in Node.js ist asynchron und wird als separater Thread ausgeführt, verwendet asynchrone Funktionsaufrufe und verarbeitet Parallelität.

Grundsätzlich werden alle Ereignismechanismen in Node.js mithilfe des Beobachtermusters im Entwurfsmuster implementiert.

Der einzelne Thread von Node.j ähnelt dem Eintritt in eine while(true)-Ereignisschleife, bis kein Ereignisbeobachter mehr auftritt. Wenn ein Ereignis auftritt, wird die Rückruffunktion aufgerufen.

Ereignisgesteuertes Modell

Node.js verwendet ein ereignisgesteuertes Modell. Wenn der Webserver eine Anfrage empfängt, schließt er diese, verarbeitet sie und bedient dann die nächste Webanfrage.

Wenn diese Anfrage abgeschlossen ist, wird sie wieder in die Verarbeitungswarteschlange gestellt, und wenn der Anfang der Warteschlange erreicht ist, wird das Ergebnis an den Benutzer zurückgegeben.

Dieses Modell ist sehr effizient und skalierbar, da der Webserver immer Anfragen akzeptiert, ohne auf Lese- oder Schreibvorgänge warten zu müssen.
(Dies wird auch als nicht blockierende E/A oder ereignisgesteuerte E/A bezeichnet)

Im ereignisgesteuerten Modell wird eine Hauptschleife generiert, um auf Ereignisse zu warten, und eine Rückruffunktion wird ausgelöst, wenn ein Ereignis erkannt wird.

Auf diese Weise wird der gesamte ereignisgesteuerte Prozess implementiert, was sehr einfach ist. Ähnlich wie beim Beobachtermuster entspricht das Ereignis einem Subjekt (Subject) und alle für dieses Ereignis registrierten Handlerfunktionen entsprechen Beobachtern (Observer).

Node.js verfügt über mehrere integrierte Ereignisse. Wir können Ereignisse binden und abhören, indem wir das Ereignismodul einführen und die EventEmitter-Klasse instanziieren, wie im folgenden Beispiel gezeigt:

//引入events模块
var events = require('events');
//创建eventEmitter对象
var eventEmitter = new events.EventEmitter();
//创建事件处理程序
var connectHandler = function connected() {
 console.log('连接成功。');
 //触发data_received事件 
 eventEmitter.emit('data_received');
}
//绑定connection事件处理程序
eventEmitter.on('connection', connectHandler);
//使用匿名函数绑定data_received事件
eventEmitter.on('data_received', function(){
 console.log('数据接收成功。');
});
//触发connection事件 
eventEmitter.emit('connection');
console.log("程序执行完毕。"); 

Das Ausgabeergebnis des obigen Codes ist:

Verbindung erfolgreich.

Daten erfolgreich empfangen.

Die Programmausführung ist abgeschlossen.

Die oben genannten Ergebnisse entsprechen genau Ihren Vorstellungen. Durch dieses ereignisgesteuerte Modell können wir asynchrone Vorgänge erreichen.

(Zum Beispiel können wir die Datei lesen, während wir andere Befehle ausführen. Nachdem das Lesen der Datei abgeschlossen ist, geben wir den Dateiinhalt als Parameter der Rückruffunktion zurück. Auf diese Weise gibt es kein Blockieren oder Warten auf Datei I /O während der Ausführung des Codes. Dies verbessert die Leistung von Node.js erheblich und kann eine große Anzahl gleichzeitiger Anforderungen verarbeiten.

var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
 if (err){
 console.log(err.stack);
 return;
 }
 console.log(data.toString());
});
console.log("程序执行完毕。"); 

Das Ausgabeergebnis des obigen Codes ist:

Die Programmausführung ist abgeschlossen.

Inhalt von input.txt.

Aus dem obigen Code können wir ersehen, dass fs.readFile Ereignisse verteilen kann. Natürlich verteilen viele Objekte in Node.js auch jedes Mal ein Ereignis, wenn eine neue Verbindung besteht. Alle diese generierten Event-Objekte sind Instanzen von events.EventEmitter.

Aber meistens verwenden wir EventEmitter nicht direkt, sondern erben ihn im Objekt. Einschließlich fs, net, http, solange die Kernmodule, die die Ereignisantwort unterstützen, Unterklassen von EventEmitter sind.

Warum machst du das? Dafür gibt es zwei Gründe:

Zunächst muss die Ereignisimplementierung eines Objekts mit einer bestimmten Entitätsfunktion der Semantik entsprechen. Die Überwachung und Ausgabe von Ereignissen sollte Methoden eines Objekts sein.
Zweitens basiert der Objektmechanismus von JavaScript auf Prototypen und unterstützt die teilweise Mehrfachvererbung. Durch die Vererbung von EventEmitter wird die ursprüngliche Vererbungsbeziehung des Objekts nicht gestört.

Lassen Sie mich mein erstes NodeJs-Projekt mit Ihnen teilen

Es gibt normalerweise zwei Möglichkeiten, Node.js zu installieren: den Quellcode selbst zu kompilieren und kompilierte Dateien zu verwenden.
Derzeit habe ich den Knoten node-v4.2.3-linux-x64, den ich gerade heruntergeladen habe, in meinem Home-Verzeichnis

1. Zuerst dekomprimieren

Code kopieren Der Code lautet wie folgt:

tar xvf node-v4.2.3-linux-x64

2. Setzen Sie den Link. Der Zweck des Setzens des Links besteht darin, dass der Knotenbefehl in jedem Pfad verwendet werden kann

Code kopieren Der Code lautet wie folgt:

ln -s /home/node-v4.2.3-linux-x64/bin/node /usr/local/bin/node
ln -s /home/node-v4.2.3-linux-x64/bin/npm /usr/local/bin/npm

3. Erstellen Sie ein Verzeichnis namens mynodeproj im Home-Ordner und erstellen Sie dann eine Datei namens server.js (natürlich können Sie sie auch anders benennen)

var http = require('http');
http.createServer(function (request, response) {
 //发送 HTTP 头部 
 //HTTP 状态值: 200 : OK
 //内容类型: text/plain
 response.writeHead(200, {'Content-Type': 'text/plain'});
 //发送响应数据 "Hello World"
 response.end('Hello World\n');
}).listen(8888);
//终端打印如下信息
console.log('Server running at http://127.0.0.1:8888/'); 

4. Gunakan arahan nod untuk melaksanakan kod di atas

pelayan nod.js

Selepas melaksanakan arahan di atas, "Server runnint at http://127.0.0.1:8888/" akan dipaparkan pada baris arahan, yang bermaksud program telah berjaya dilaksanakan!

Oleh kerana pelayan saya berjalan di Alibaba Cloud, saya boleh mengaksesnya dengan hanya menaip port IP Alibaba Cloud dalam penyemak imbas luaran.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn