Dieser Artikel hilft Ihnen, das Blockieren und Nichtblockieren in Nodejs zu verstehen. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.
Empfohlene Studie: „nodejs-Tutorial“
Jeder sollte ein gewisses Verständnis für die beiden Konzepte des Blockierens und Nichtblockierens haben:
Einfach ausgedrückt wird das Blockieren hauptsächlich durch den Nicht-Blockierungsmodus verursacht. Blockieren kann als asynchroner Modus verstanden werden, der einige zeitaufwändige Vorgänge verarbeitet. Wie werden also Blockieren und Nichtblockieren in Node.js beschrieben? Das Folgende erklärt dieses Problem hauptsächlich:
Was blockiert in Node?
E/A-Vorgänge können so verstanden werden, dass sie sich hauptsächlich auf die Interaktion mit der Systemfestplatte (Lesen und Schreiben von Daten) oder Netzwerkanforderungen usw. beziehen.
Blockieren bedeutet, dass die Ausführung anderen JS-Codes bis zum vorherigen Zeitpunkt warten muss. verbrauchender E/A-Vorgang
oder einige Netzwerkanforderungen sind abgeschlossen. Da Node über eine Ereignisschleife verfügt, um dieses Problem zu lösen, führt es tatsächlich zu einer Blockierung, wenn die Ereignisschleife während der Ausführung von js nicht aktiviert wird.
Tatsächlich gibt es in Node.js unter normalen Umständen Blockierungssituationen. Der Grund dafür ist, dass die asynchrone Verarbeitung von Node für E/A-Vorgänge [unter Verwendung von Ereignisschleifen] benutzerfreundlicher ist, jedoch für einige CPU-intensive Vorgänge, die in JavaScript vorhanden sein können Die Leistung ist relativ gering. Einige Studenten fragen sich vielleicht: Warum kann Node.js CPU-intensive Vorgänge nicht asynchron unterstützen? Denn es versteht sich, dass es sich bei diesen CPU-intensiven Vorgängen tatsächlich um einige synchrone Codes handelt, wie z. B. eine große Anzahl von for-Schleifen, umfangreiche Datenberechnungen usw. I/O操作
或者一些网络请求等完成之后。因为Node存在事件循环来解决这个问题,那假如说js再执行的过程中,事件循环没有被开启,其实就会造成阻塞的情况发生。
其实在Node.js中正常情况下也是存在被阻塞的情况,原因是Node的异步处理针对于I/O操作比较友好【利用事件循环】,但是对于JavaScript可能存在的一些CPU密集型的操作性能就比较低。有的同学可能会说,为什么CPU密集型的操作Node.js不能够异步支持呢?因为可以理解这些CPU密集型操作,其实都是一些同步代码,比如大量的for循环,海量的数据计算等。
Node.js的标准库中也存在一些同步的方法,这些方法大部分都是基于libuv
来实现阻塞的效果。Node的原生模块中也存在一些阻塞方法。不过同时Node也会提供对应的异步版本的API。
什么事libuv呢? 是一个支持多平台的针对于异步I/O操作的库。 详细可见官网:https://libuv.org/
Node中什么是非阻塞呢?
首先思考一下在不局限于Node的背景之下如何实现非阻塞(异步)呢?
简单说两个:
1)可以开多个线程去处理并发的操作
2)事件循环的模式,如果有异步操作放在事件队列中,异步操作结束之后,调用对应的回调函数处理异步返回结果
Node.js是单线程的,原因是:Node.js外层是由JavaScript实现的,JavaScript的解释执行是通过V8引擎
libuv
basieren, um Blockierungseffekte zu erzielen. Es gibt auch einige Blockierungsmethoden in den nativen Modulen von Node. Allerdings wird Node auch eine entsprechende asynchrone Version der API bereitstellen.
Was ist libuv? Es handelt sich um eine Bibliothek für asynchrone I/O-Operationen, die mehrere Plattformen unterstützt. Einzelheiten finden Sie auf der offiziellen Website: https://libuv.org/Was ist nicht blockierend in Node?
Um es einfach auszudrücken:Überlegen Sie zunächst, wie Sie in einem Kontext, der nicht auf Knoten beschränkt ist, eine nicht blockierende (asynchrone) Implementierung erreichen können.
1) Mehrere Threads können geöffnet werden, um gleichzeitige Vorgänge zu verarbeiten
2) Ereignisschleifenmodus: Wenn ein asynchroner Vorgang in der Ereigniswarteschlange platziert wird, wird nach dem Ende des asynchronen Vorgangs die entsprechende Rückruffunktion aktiviert heißt „Verarbeitung asynchroner Rückgabeergebnisse“🎜🎜Node.js ist Single-Threaded. Der Grund dafür ist: Die äußere Schicht von Node.js wird von JavaScript implementiert und die Interpretation und Ausführung von JavaScript erfolgt über dieV8-EngineCode>. 🎜🎜Da die Ausführung von JS Single-Threaded ist, ist es für uns unmöglich, während der JS-Interpretation und -Ausführung einen anderen Thread zur Interpretation und Ausführung zu öffnen. Daher verwendet Node.js die zweite Methode, um eine nicht blockierende (asynchrone Operation) zu erreichen. 🎜🎜🎜Achten Sie darauf, blockierende und nicht blockierende APIs in Node nicht zu vermischen.🎜🎜🎜🎜Englische Originaladresse: https://nodejs.org/en/docs/guides/blocking-vs-non-blocking/🎜🎜🎜Mehr Programmierung Für entsprechendes Wissen besuchen Sie bitte: 🎜Programmiervideo🎜! ! 🎜
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Blockierens und Nichtblockierens in Nodejs. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!