2011-10-08 14 views
36

Skoro wiele skryptów node.js działa według schematu robienia czegoś asynchronicznie (przykład poniżej), skąd mają wiedzieć, kiedy zatrzymać?W jaki sposób proces node.js wie, kiedy należy zatrzymać?

W poniższym kodzie, w jaki sposób węzeł określa po przetworzeniu pliku writeFile i odpowiednio rejestrując wywołanie zwrotne, że proces powinien być utrzymywany przy życiu aż do uruchomienia wywołań zwrotnych?

fs = require('fs'); 

fs.writeFile('foo', 'cat', function() { 
    console.log('wrote to foo!'); 
    fs.readFile('foo', 'utf8', function(err, data) { 
    console.log(data); 
    }); 
}); 

Odpowiedz

40

węzeł śledzi wszystkie zaległe zlecenia pracy. Wywołanie fs.writefile() tworzy żądanie pracy dla operacji we/wy i dodaje wywołanie zwrotne do tego żądania. węzeł zapisuje żądanie pracy do swoich tabel w tym samym czasie, gdy rozpoczyna działanie we/wy. Wykonywanie kodu kończy się po osiągnięciu końca funkcji. (Ale swoją pamięć/zmienne/itp. Pozostają)

Później I/O i wykończenia węzeł wykonuje żądanie wyszło z jej stolików. Widzi wywołanie zwrotne dołączone do żądania, a więc wywołania, które działają z wynikami żądania we/wy. Twoje globalne dane wciąż istnieją, a wszelkie zmienne w zamknięciach wciąż istnieją, więc wydaje się, że Twój kod nigdy się nie zatrzymał.

Jeśli nic więcej nie zrobisz, nie rób więcej żądań, wtedy po powrocie z funkcji węzeł zatrzyma się, ponieważ wtedy nie będzie żadnych pozostałych żądań w kolejkach.

Więc węzeł „wie” biec, ponieważ tory aktywnych żądań pracy w swoich tabelach i nie zatrzyma się dopóki wszyscy w kolejce praca jest wykonywana, a te tabele są puste.

Należy pamiętać, że „w kolejce pracy” może obejmować takie rzeczy jak czekanie dla timerów lub czeka na dane sieciowe przyjeżdżać. Składasz prośbę, która mówi "zadzwoń do mnie, kiedy/jeśli coś się stanie później".

setTimeout() również jest żądaniem pracy (jeśli trochę zmrużysz oczy). Dzięki zegarowi wiesz, że coś się wydarzy i kiedy to się stanie. Z setTimeout() nastąpi tylko jedno "coś". węzeł wykona tylko jedno połączenie z twoim oddzwonieniem, a następnie "zapomni" o zleceniu pracy. Jeśli zamiast tego użyjesz setInterval(), utworzyłeś trwałe zlecenie pracy. węzeł będzie "przechowywać" żądanie pracy w swoich tabelach i będzie wywoływał twoje wywołania zwrotne wielokrotnie, aż anulujesz żądanie.

net.Server.listen() to kolejny wniosek dzieło, które jest trwałe żądanie praca. Nie wiadomo, kiedy wywołanie zwrotne zostanie wywołane lub ile razy, ponieważ zależy to od zdalnego klienta łączącego się z serwerem. Węzeł utrzymuje żądanie pracy przy życiu w swoich tabelach do momentu anulowania żądania.

+15

Czy pojęcia zleceń pracy i tabel są tworzone przez Ciebie w celu zilustrowania Twojego punktu lub czy są to rzeczywiste konstrukcje użyte w implementacji węzła? Pytam, ponieważ nie widzę tych terminów używanych nigdzie indziej. – d512

+0

Uważam, że zlecenia pracy są znane jako zadania, a tabele są kolejkami zadań. Zobacz https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ –

Powiązane problemy