javascript - Event Driven und Concurrency-Probleme?

8

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?

    
Daniel 17.11.2010, 21:03
quelle

4 Antworten

9

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.

    
Amnon 17.11.2010, 21:35
quelle
3

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.

    
Jacob Mattison 17.11.2010 21:08
quelle
2

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>     

Justin Ethier 17.11.2010 21:11
quelle
1

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.

    
Uzair Farooq 17.07.2015 07:52
quelle