Lassen Sie uns einen Blick darauf werfen, was Blockierungsvorgänge sind.
Ich simuliere eine Sleep()-Methode, um das Drucken von „Hello Star“ um 10 Sekunden zu verzögern.
requestHandlers.js
Beim Anfordern/Start gibt es eine Verzögerung von 10 Sekunden vor dem Drucken.
Beim Anfordern/Hochladen wird dies nicht beeinträchtigt.
Machen wir ein Experiment:
Geben Sie http://localhost:8888/start in die Adressleiste des ersten Browserfensters ein, aber öffnen Sie es noch nicht!
Geben Sie http://localhost:8888/upload in die Adressleiste des zweiten Browserfensters ein. Öffnen Sie es noch nicht!
Wir drücken im ersten Fenster („/start“) die Eingabetaste, wechseln dann schnell zum zweiten Fenster („/upload“) und drücken die Eingabetaste.
Achtung, was ist passiert:
Das Laden der/start-URL dauerte 10 Sekunden, was wir erwartet hatten.
Die/Upload-URL dauerte ebenfalls 10 Sekunden!
Ja, es gibt keine ähnlichen Operationen wie „sleep()“ im entsprechenden Anforderungshandler. Was ist das Problem?
Der Grund dafür ist, dass start() blockierende Operationen enthält. Im übertragenen Sinne „blockiert es alle anderen Verarbeitungsarbeiten.“
Node.js ist Single-Threaded und kann Aufgaben parallel verarbeiten, ohne zusätzliche Threads hinzuzufügen.
Es implementiert parallele Operationen durch eine Ereignisschleife. Wir sollten dies voll ausnutzen – blockierende Operationen so weit wie möglich vermeiden und stattdessen nicht blockierende Operationen verwenden.
Im nächsten Abschnitt stellen wir vor, wie nicht blockierende Vorgänge implementiert werden.