💡 Wiedzieliście, że w Node.js mamy do dyspozycji potężne usprawnienie, które otwiera nowe rozdanie? Importując setTimeout
bądź setInterval
z paczki “node:timers/promises” są one od razu opakowane w Promise! 😅
🤔 Ale jak to się dzieje, że setTimeout
w ogóle działa?!
Node.js jest jednowątkowy - silnik V8, na którym działa, obsługuje w głównym wątku tylko jedną operację naraz. Zrobiłoby się niezręcznie, gdyby każda akcja I/O blokowała nam całkowicie aplikację, prawda? Dlatego twórcy wdrożyli wzorzec event loop. Mechanizm ten dla Node.js w każdym cyklu wykonuje kilka istotnych akcji. Jedną z nich jest sprawdzanie timerów - czyli funkcji setTimeout
oraz setInterval
, czy “ich czas już przypadkiem nie nadszedł”.
Ale skąd event loop to wie? ⏰
Event loop sam w sobie nie posiada “wiedzy” o tym, że jakiś czas już nadszedł, by obsłużyć callback z timera. Z zasady jest tylko pętlą wywoływaną przez różne zdarzenia.
Gdy setTimeout
jest uruchamiany, obliczany jest czas, kiedy ma on wrócić na kolejkę wraz ze swoim callbackiem. Za te kalkulacje i zarejestrowanie tego zdarzenia odpowiedzialna jest niskopoziomowa biblioteka libuv
. To ona zarządza asynchronicznymi operacjami I/O, timerami systemowymi, etc. na potrzeby Node.js. I to ona, dzięki swojej wewnętrznej pętli zintegrowanej z systemem operacyjnym, informuje, że to już najwyższy czas na uruchomienie naszego callbacka.
libuv
sama w sobie nie stanowi mechanizmu event loop, a jedynie dostarcza potrzebne mechanizmy przez swoje API, by Node.js mógł się nimi posiłkować i obsługiwać asynchroniczne operacje.
Gdzie dokładnie libuv
znajduje się w naszej node’owej układance - o tym już wkrótce! 😉