2010-11-17 14 views
8

Pozdrowienia,javascript - problemy związane z zdarzeniami i współbieżnością?

Studiuję javascript, nodejs. I nie rozumiem, jak uniknięto problemów współbieżności w javascript.

Powiedzmy pracuję na obiekcie

var bigObject = new BigObject(); 

i mam setTimer(function(){ workOnBigOjbect...}) że będzie również działają na bigOjbect.

Jeśli mam dysk IO zapisywane w bigObject i obiekt Timer działa na bigObject i regularnie czyta kod z bigObject, jak są problemy współbieżności uniknąć?

W zwykłym języku użyłbym muteksowego lub wątkowo bezpiecznego wzorca kolejki/polecenia. Nie widzę też wiele dyskusji na temat warunków wyścigu dla javascript.

Czy brakuje mi czegoś?

Odpowiedz

9

Cały punkt node.js polega na tym, że jest sterowany zdarzeniami. Cały kod działa w procedurach obsługi zdarzeń w jednym wątku. Nie ma problemów z współbieżnością, ponieważ kod nie działa jednocześnie. Minusem jest to, że każda procedura obsługi zdarzeń musi szybko wyjść, ponieważ blokuje inne zdarzenia.

W tym przykładzie kod uruchomi dysk IO i natychmiast zakończy pracę. Infrastruktura node.js powiadomi program, że operacja IO została zakończona, uruchamiając procedurę obsługi zdarzeń. Zdarzenie licznika czasu zostanie wywołane przed lub po zdarzeniu We/Wy, ale nigdy jednocześnie.

+3

* scrrraatchhhhh * dźwięk przełączania biegów w mojej głowie! Rozumiem, ale potrzebuję pośredniczyć w tym więcej. – Daniel

+1

Najlepszym sposobem na zrozumienie jest użycie go - napisanie kilku małych programów w pliku node.js. – Amnon

+0

@ Daniel, czy miałeś na myśli medytację? :) Sądzę, że po prostu usłyszałem te same dźwięki w mojej głowie. Ile razy - przechodzenie między językami a platformami, zanim mój mózg się rozpadnie? – snapfractalpop

3

Javascript jest jednowątkowy. Jeśli nadejdzie czas, kiedy twoja funkcja ma zostać wykonana (na podstawie tego, jak nazwałeś setTimer), a kod nadrzędny nadal działa, funkcja nie zostanie wykonana, dopóki nie zakończy się kod nadrzędny.

2

Jest tylko jeden wątek; zobacz: Node.js on multi-core machines

Spekulowałbym, że dzieje się tak dlatego, że wiele wątków nie jest obsługiwanych w podstawowym silniku JavaScript V8, ponieważ typowy JavaScript jest wykonywany w przeglądarce (gdzie w przypadku Windows istnieje tylko jeden wątek UI) i nie obsługuje wiele wątków.

+0

To właściwie decyzja projektowa: procesy są podstawową jednostką node.js. W każdym razie JavaScript jest językiem, w którym występują zdarzenia, więc wątki naprawdę nie mają sensu. – xj9

1

Jest to coś w javascript pod nazwą Run-to-Completion, które zapewnia, że ​​jeśli kod jest wykonywany, wykonuje się całkowicie przed uruchomieniem jakiegokolwiek innego (asynchronicznego) kodu, a więc bez problemów z współbieżnością.

W przypadku twojego przykładu za każdym razem, gdy zostanie wywołane wywołanie zwrotne odliczania czasu, zostanie ono wykonane całkowicie i nigdy nie zostanie uprzedzone w środku, aby wykonać inny kod.

Aby uzyskać więcej informacji, patrz Why no concurrency control tool in javascript.

Powiązane problemy