Grüße,
Ich habe Javascript, Nodejs studiert. Und ich verstehe nicht, wie die Nebenläufigkeit Probleme in Javascript vermieden werden.
Sagen wir, ich arbeite an einem Objekt
%Vor% und ich habe eine setTimer(function(){ workOnBigOjbect...} )
, die auch am bigOjbect
funktioniert.
Wenn ich Datenträger-IO in bigObject
geschrieben habe und ein Timer-Objekt an bigObject
arbeitete und das Lesen von bigObject
regelmäßig codierte, wie wurden Nebenläufigkeitsprobleme vermieden?
In einer normalen Sprache würde ich ein Mutex- oder Thread-sicheres Warteschlangen- / Befehlsmuster verwenden. Ich sehe auch nicht viel Diskussion über Race-Bedingungen für Javascript.
Vermisse ich etwas?
Der Hauptpunkt von node.js ist, dass es ereignisgesteuert ist. Der gesamte Code wird in Ereignishandlern in einem einzelnen Thread ausgeführt. Es gibt keine Gleichzeitigkeitsprobleme, da der Code nicht gleichzeitig ausgeführt wird. Der Nachteil ist, dass jeder Ereignishandler schnell beendet werden muss, weil er die anderen Ereignisse blockiert.
In Ihrem Beispiel wird der Code die Datenträger-IO starten und sofort beenden. Die node.js-Infrastruktur benachrichtigt das Programm, dass der IO-Vorgang abgeschlossen wurde, indem ein Ereignishandler ausgeführt wird. Das Timer-Ereignis wird vor oder nach dem IO-Ereignis, aber niemals gleichzeitig aufgerufen.
Javascript ist single-threaded. Wenn die Zeit eintrifft, zu der Ihre Funktion ausgeführt werden soll (basierend darauf, wie Sie setTimer aufgerufen haben) und der Parent-Code noch ausgeführt wird, wird die Funktion erst ausgeführt, wenn der Parent-Code abgeschlossen ist.
Es gibt nur einen einzigen Thread; siehe: Node.js auf Multicore-Rechnern
Ich würde spekulieren, dass dies darauf zurückzuführen ist, dass mehrere Threads in der zugrunde liegenden V8-JavaScript-Engine nicht unterstützt werden, da JavaScript normalerweise in einem Browser ausgeführt wird (in einem Windows-Fall gibt es nur einen einzigen UI-Thread) und mehrere Threads nicht unterstützt / p>
Es gibt dieses Ding in Javascript namens Run-to -Completion , die sicherstellt, dass, wenn ein Code ausgeführt wird, er vollständig ausgeführt wird, bevor anderer (asynchroner) Code ausgeführt wird, daher keine Parallelitätsprobleme.
Im Falle Ihres Beispiels, wann immer der Timer-Callback aufgerufen wird, wird er vollständig ausgeführt und wird niemals in der Mitte vorgezogen, um anderen Code auszuführen.
Siehe Warum kein Tool zur Steuerung des gemeinsamen Zugriffs in JavaScript für weitere Details.
Tags und Links javascript race-condition node.js concurrency