2017-07-06 3 views
-4

Da der Knoten läuft ein Single-Threaded-Modell mit Ereignisse Looping ich frage mich, wie Knoten die gesamte Anwendung verhindert, wenn Sie einen Code wie schreiben zum Scheitern verurteilt:Wie verhindert der Knoten eine Endlosschleife?

while(true){ doSomething()} 

wo doSomething eine synchrone Funktion (ein Sperr Stück Code) ist

Beachten Sie, dass es keinen Sinn macht, eine Funktion wie doSomething zu schreiben, aber nichts hindert Sie einen Fehler

zu machen Wenn der Knoten diese Art von Situationen nicht verhindern können, ist dies ein Fehler Design oder es gibt keinen Weg um diese Art von Problemen zu verhindern?

Das Problem hier ist, dass es, da es single-threaded ist, keine anderen Teile der Anwendung laufen lässt (zum Beispiel würde ein Webserver keine neuen Verbindungen akzeptieren), weil diese Funktion niemals enden würde. In einer Multi-Thread-Umgebung würden Sie diesen Thread allein verlieren

+0

Es ist nicht möglich, Endlosschleifen zu verhindern - https://en.wikipedia.org/wiki/Halting_problem – MrDiggles

+0

Was lässt Sie denken, dass das Beispiel * nicht * unendlich lange läuft? – qlown

+1

Knoten schützt Sie nicht vor sich selbst. Es tut uns leid. – PeterVC

Antwort

1

Ich frage mich, wie Knoten die gesamte Anwendung verhindert, wenn Sie eine Endlosschleife

NodeJS schreiben scheitern nicht so eine Endlosschleife verhindern. Es wird nur diese Schleife für immer ausgeführt oder bis eine Ressource erschöpft ist (wenn die Schleife eine Ressource wie Speicher verbraucht).

Wenn Knoten diese Art von Situationen nicht verhindern können, ist dies ein Konstruktionsfehler oder gibt es keine Möglichkeit, diese Art von Problemen zu verhindern?

Ich glaube nicht, dass die meisten Leute es als Designfehler betrachten - obwohl das eine reine Meinung ist und andere Leute eine andere Meinung haben. Es ist eine Konsequenz der Art und Weise, wie nodejs entworfen wurde, die viele andere Vorteile hat.

Die einzige Möglichkeit, solche Probleme zu vermeiden, ist, keinen fehlerhaften Code zu schreiben, der dies tut. Ehrlich gesagt, ist es nicht allzu schwer zu vermeiden, diese Art von Code zu schreiben, wenn Sie sich bewusst sind, dass dies ein Problem ist, das Sie vermeiden sollten. Das Problem hierbei ist, dass es, da es single threaded ist, keine anderen Teile der Anwendung ausführen lässt (zum Beispiel würde ein Webserver keine neuen Verbindungen akzeptieren), weil diese Funktion niemals enden würde. In einer Umgebung mit mehreren Threads würden Sie diesen Thread allein verlieren

Richtig. Das lernen Sie, wenn Sie in nodejs codieren. Ich habe es nie schwer gefunden, es zu vermeiden. nodejs ist ein single-threaded ereignisgesteuertes System, kein multi-threaded System. Daher programmieren Sie mit Ereignissen, nicht lange laufenden Schleifen, die Bedingungen abfragen oder überprüfen. Es ist ein ziemlich einfaches Konzept zu lernen und zu verwenden, sobald Sie das verstehen, wie nodejs funktioniert. Es ist anders als in anderen Umgebungen. Aber, wie asynchrone Operationen in Nodejs zu verwenden, ist nur etwas, das Sie lernen müssen, in dieser Umgebung zu programmieren. Es ist nicht vermeidbar und ist nur ein Teil des Charakters von Nodejs. Es gibt keine Möglichkeit, dass nodejs die Art von Architektur haben kann, ohne dass man lernen muss, dass sie darin programmieren kann. Wenn Sie eine andere Architektur (aus welchem ​​Grund auch immer) möchten, wählen Sie eine andere Umgebung, nicht nodejs.

Die single-threadness vereinfacht massiv viele andere Dinge (weit, viel weniger Möglichkeiten für Race-Bedingungen) und verbessert die Skalierbarkeit unter bestimmten Umständen (mit asynchronen I/O) vs Thread-Umgebungen. In Situationen, in denen mehrere CPUs auf Ihr Problem angewendet werden sollen, ist es in node.js im Allgemeinen unkompliziert, entweder das integrierte Clustering-Modul zu verwenden oder Arbeitsprozesse zu starten und zu füttern. Daten werden häufig über eine Art Datenbank (entweder dateibasiert oder RAM-basiert), die einen Großteil der Synchronisation mehrerer Prozesse für Sie erledigt, zwischen mehreren Prozessen ausgetauscht.

0

Es tut es nicht. Dies scheint weniger eine Frage und eher eine offene Aussage zu sein. Der Knoten wird unendlich wiederholt und der gesamte parallele Code wird nicht mehr ausgeführt.

Verwandte Themen