Kann node.js code Ergebnis in race conditions?
Aus, was ich lese, race conditions auftreten, wenn verschiedene threads zu ändern versuchen, eine gemeinsam genutzte variable, die zu einem Wert führen, ist nicht möglich, mit einer seriellen Reihenfolge der Ausführung von threads.
Aber code in node.js läuft in einem einzigen thread, so bedeutet das, dass code geschrieben node.js ist frei von race conditions?
InformationsquelleAutor der Frage Jatin | 2014-01-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht. Das stimmt man kann keine race condition bei der ein einzelnes Gewinde, nicht I/O zu tun Programm.
Aber node.js ist vor allem schnell wegen seiner non-blocking Art der Programmierung. Non-blocking bedeutet, dass die Erstellung eines Hörer zu einer Reaktion Veranstaltung, können Sie etwas anderes tun, während warten diese Antwort.
Warum ? Weil die Arbeit immer die Antwort erfolgt in einem anderen thread. Datenbank, Dateisystem, die Ausführung auf anderen thread, client offensichtlich läuft auf einem anderen computer, und Sie das Programm workflow abhängen kann
seine Antwort.
So streng genommen node.js läuft in einem thread, aber Ihre workflow-Programm, die include-I/O (Datenbank, filesystem), client und alles läuft auf vielen thread.
Also es kann immer noch sein race-Bedingung, wenn Sie eine Anfrage, um etwas hinzufügen zu einer Datenbank, dann senden Sie einfach eine Anfrage zu löschen, ohne warten auf die Antwort der ersten Anfrage. Würde es auch keine race-condition, wenn die Datenbank läuft im gleichen thread wie node.js und die Anfrage war nur ein Funktionsaufruf ausgeführt sofort.
InformationsquelleAutor der Antwort Guilro
Ja. Node.js kann in Wettkampfsituationen, sobald Sie beginnen, die gemeinsame Nutzung von Ressourcen.
Ich irrtümlich dachte auch, man könnte keine race conditions in Node.js da es die single threaded Natur, aber sobald Sie verwenden eine freigegebene Ressource außerhalb von Knoten (z.B. eine Datei aus dem Dateisystem) man kann in eine race-Bedingung. Ich postete ein Beispiel für dieses Problem in diese Frage, als ich versuchte, dies zu verstehen: node.js readfile leiden
Was ist anders in Node.js aus anderen Umgebungen ist, dass Sie einen einzigen thread der Ausführung von JavaScript-Code, so gibt es nur eine JavaScript-Instanz mit dem code (wie oppossed zu einer Multithread-Umgebung, in der es viele threads Ihrem app-code zur gleichen Zeit.)
InformationsquelleAutor der Antwort Hector Correa
Jarace-Bedingungen (im Sinne einer freigegebenen Ressource mit einem inkonsistenten Wert aufgrund der Reihenfolge der Ereignisse) kann immer noch passieren überall, es gibt einen Punkt der Aussetzung dazu führen könnte, dass andere code ausgeführt (mit Fäden, die am jede Zeile), nehmen Sie zum Beispiel dieses Stück von asynchronem code ist komplett single-threaded:
Dieser code-Punkte-Aufhängung bei jedem einzelnen erwarten und als solche könnte context-switch zwischen den beiden Funktionen auf eine schlechte Zeit zu produzieren "$50" anstatt des erwarteten "$100", dies ist im wesentlichen das gleiche Beispiel wie Wikipedia-Beispiel für Race Conditions in threads, die aber mit expliziten Punkten der Aufhängung/re-entry.
Genau wie threads, aber lösen können Sie solche race conditions mit Dingen wie einem Schloss (aka mutex). So konnten wir verhindern, dass die oben genannten race-Bedingung in der gleichen Weise wie threads:
InformationsquelleAutor der Antwort Jamesernator
Nicht. Node.js ist frei von race conditions, dass würde die verursacht werden durch Kontextwechsel; jedoch können Sie immer noch schreiben node.js Programm, mit dem asynchrone Ereignisse in einer unerwarteten Reihenfolge Ergebnis in einem inkonsistenten Zustand.
Angenommen, Sie haben zwei Funktionen. Das erste sendet eine Nachricht über einen WebSocket und einen Rückruf, speichert die Antworten. Die zweite Funktion löscht alle gespeicherten Antworten. Aufruf der Funktionen in der Reihenfolge ist keine Garantie für eine leere Nachricht Liste. Es ist wichtig zu prüfen, alle möglichen Ereignis kauft, wenn dabei die asynchrone Programmierung.
EDIT: Hier einige Beispiel-code
InformationsquelleAutor der Antwort acbabis
Race conditions können immer noch vorkommen, als Sie wirklich haben nichts zu tun mit threads, sondern auf Annahmen über event-timing und die Reihenfolge, so threads sind nur ein Beispiel.
Node.js ist single-threaded, aber immer noch gleichzeitig, und race conditions) sind möglich. Zum Beispiel:
Diesem Programm senden soll, Kunden eine Größe, die Ihrer Anfrage. Wenn Sie es testen, werden offenbar korrekt funktioniert. Aber es ist eigentlich basiert auf der impliziten Annahme, dass nichts passiert zwischen request start-und end-Ereignisse. Wenn es 2 oder mehr clients gleichzeitig, es wird nicht funktionieren.
Dies geschieht hier, weil
size
variable geteilt wird, wie eine Menge, wenn zwei threads teilen sich eine variable. Können Sie denken über einen abstrakten "asynchrnous Kontext", das ist ein viel wie Faden, aber es kann nur ausgesetzt werden, an bestimmten stellen.InformationsquelleAutor der Antwort vkurchatkin
Ja. Es kann.
Race-Bedingung in Nodejs ist möglich, wenn Sie verwenden
cluster
Modul zu initialisieren, mehrere Arbeiter.Der Fall
Wenn Sie die überwachte Datei, 4 Arbeiter ausgeführt wird, der handler in der gleichen Zeit. Dieses Verhalten bewirkt, dass die unbestimmten
newData
.Die Lösung
InformationsquelleAutor der Antwort Lewis