Kaip „Event Loop“ veikia „JavaScript“?

Nors norint parašyti viso masto gamybos kodą gali prireikti išsamaus kalbų, tokių kaip C ++ ir C, supratimo, „JavaScript“ dažnai gali būti parašytas tik gerai suprantant, ką galima padaryti su kalba.


Koncepcijas, tokias kaip funkcijų atšaukimas ar asinchroninio kodo rašymas, dažnai nėra taip sunku įgyvendinti, todėl dauguma „JavaScript“ kūrėjų mažiau rūpinasi tuo, kas vyksta po gaubtu. Jiems tiesiog nerūpi suprasti sudėtingumus, kuriuos nuo kalbos labai atsiriboja.

Kaip „JavaScript“ kūrėjui, tampa vis svarbiau suprasti, kas iš tikrųjų nutinka po gaubtu ir kaip iš tikrųjų veikia dauguma šių sudėtingų savybių. Tai padeda mums priimti labiau pagrįstus sprendimus, o tai savo ruožtu gali drastiškai padidinti mūsų kodo našumą.

Šiame straipsnyje nagrinėjama viena iš labai svarbių, bet retai suprantamų „JavaScript“ sąvokų ar terminų. RENGINIŲ LAIKAS!. 

„JavaScript“ negalima išvengti asinchroninio kodo rašymo, tačiau kodėl iš tikrųjų reiškia asinchroniškai veikiantį kodą? t.y. Renginių kilpa

Kad suprastume, kaip veikia įvykio ciklas, pirmiausia turime suprasti, kas yra „JavaScript“ ir kaip jis veikia!

Kas yra „JavaScript“?

Prieš pradėdami toliau, norėčiau, kad mes atsigręžtume į pačius pagrindus. Kas iš tikrųjų yra „JavaScript“? Mes galime apibrėžti „JavaScript“ kaip;

„JavaScript“ yra aukšto lygio, aiškinama, viena gija, neužblokuojanti, asinchroninė, tuo pat metu vykstanti kalba.

Palauk, kas tai? Knygiškas apibrėžimas? ��

Išardykime!

Raktiniai žodžiai, susiję su šiuo straipsniu, yra viengysliai, neužblokuojantis, lygiagretus, ir asinchroninis.

Viengubas siūlas

Vykdymo gija yra mažiausia užprogramuotų komandų seka, kurią planuotojas gali valdyti savarankiškai. Programavimo kalba yra viena gija, tai reiškia, kad ji vienu metu gali atlikti tik vieną užduotį ar operaciją. Tai reiškia, kad jis vykdys visą procesą nuo pradžios iki pabaigos, nenutraukdamas ar sustabdydamas giją.

Skirtingai nuo kalbų su daugybe gijų, kuriose kelis procesus vienu metu galima vykdyti keliais procesais neužblokuojant vienas kito.

Kaip „JavaScript“ gali būti sudaryta iš vienos gijos ir neblokuojantis Tuo pačiu metu?

Bet ką reiškia blokavimas?

Neblokavimas

Nėra vieno blokavimo apibrėžimo; tai tiesiog reiškia dalykus, kurie lėtai eina į giją. Taigi neužblokavimas reiškia dalykus, kurie nėra lėti.

Bet palaukite, ar aš sakiau, kad „JavaScript“ veikia viena gija? Aš taip pat pasakiau, kad tai neužkerta kelio, o tai reiškia, kad užduotis greitai turi būti vykdoma skambučių rinkinyje? Bet kaip??? O kaip tada, kai mes vykdome laikmačius? Kilpos?

Atsipalaiduokite! Mes tai sužinojome po truputį ��.

Kartu

Lygiagretumas reiškia, kad kodas tuo pačiu metu vykdomas daugiau nei viena gija.

Gerai, kad viskas klostosi iš tikrųjų keistai Dabar, kaip „JavaScript“ gali būti viena gija ir tuo pat metu būti vienu metu? y., jo kodo vykdymą naudojant daugiau nei vieną giją?

Asinchroniškai

Asinchroninis programavimas reiškia, kad kodas veikia įvykio kilpoje. Kai vyksta blokavimo operacija, įvykis pradedamas. Blokavimo kodas ir toliau veikia neužblokuodamas pagrindinės vykdymo gijos. Kai blokavimo kodas baigsis, jis susidaro užblokavimo operacijų rezultatas ir stumia jas atgal į krūvą.

Bet „JavaScript“ turi vieną giją? Kas tada vykdo šį blokavimo kodą, tuo pačiu leisdamas vykdyti kitus gijos kodus?

Prieš pradėdami toliau, pažvelkime į aukščiau aprašytą dalyką.

  • „JavaScript“ yra su viena gija
  • „JavaScript“ neužblokuoja, ty lėti procesai neužkerta kelio jo vykdymui
  • „JavaScript“ yra tuo pačiu metu, t.y., jis vykdo savo kodą daugiau nei vienoje gijoje tuo pačiu metu
  • „JavaScript“ yra asinchroninė, t. Y. Ji kažkur kitur veikia blokavimo kodą.

Bet tai, kas išdėstyta aukščiau, nėra tiksliai sudėti, kaip kalba su viena gija gali būti neblokuojanti, kartu vykdoma ir asinchroninė?

Pažvelkime šiek tiek giliau, pereikime prie „JavaScript“ runtime variklių, V8, galbūt jame yra paslėptų gijų, apie kurias mes nežinome.

V8 variklis

„V8“ variklis yra didelio našumo, atvirojo kodo žiniatinklio rinkinio veikimo variklis, skirtas „JavaScript“, parašytas „C ++“ „Google“. Daugelis naršyklių vykdo „JavaScript“ naudodamiesi V8 varikliu, ją naudoja ir populiari mazgo js runtime aplinka.

Paprasta anglų kalba V8 yra C ++ programa, kuri priima „JavaScript“ kodą, jį sukompiluoja ir vykdo.

V8 daro du pagrindinius dalykus;

  • Krūvos atminties paskirstymas
  • Skambučių kamino vykdymo kontekstas

Deja, mūsų įtarimas buvo neteisingas. V8 turi tik vieną skambučių kaminą, pagalvokite apie skambučių kaminą kaip siūlą.

Vienas siūlas === vienas skambučių rinkinys === vienas vykdymas vienu metu.

Vaizdas – „Hacker Noon“

Kadangi V8 turi tik vieną skambučių rinkinį, kaip tada „JavaScript“ veikia tuo pačiu metu ir asinchroniškai, neužblokuojant pagrindinio vykdymo gijos?

Pabandykime išsiaiškinti parašydami paprastą, tačiau bendrą asinchroninį kodą ir kartu jį išanalizuokite.

„JavaScript“ kiekvieną kodą eina kiekvieną eilutę po vieną (viena sriegiu). Kaip ir tikėtasi, pirmoji eilutė čia bus išspausdinta konsolėje, bet kodėl paskutinė eilutė spausdinama prieš laiko kodą? Kodėl vykdymo procesas nelaukia laiko intervalo kodo (blokavimo), prieš eidamas į priekį, kad paleistumėte paskutinę eilutę?

Panašu, kad kažkokia kita gija padėjo mums įvykdyti tą laiko tarpą, nes mes esame tikri, kad gija bet kuriuo metu gali vykdyti tik vieną užduotį.

Pasižiūrėkime į V8 šaltinio kodas kurį laiką.

Palauk, ką??!!! „V8“ nėra laikmačio funkcijų, nėra DOM? Nėra įvykių? Nėra AJAX?…. Yeeeeessss!!!

Įvykiai, DOM, laikmačiai ir kt. Nėra pagrindinės „JavaScript“ diegimo dalys. „JavaScript“ griežtai atitinka „Ecma“ scenarijų specifikacijas, o įvairios jo versijos dažnai nurodomos pagal „Ecma“ scenarijų specifikacijas (ES X)..

Vykdymo darbo eiga

Visi įvykiai, laikmačiai ir „Ajax“ užklausos yra teikiamos kliento naršyklėse ir dažnai vadinamos žiniatinklio API. Jie yra tie, kurie leidžia „Java“ su vienu sriegiu būti neužblokuoti, vienu metu ir asinchroniškai! Bet kaip?

Yra trys pagrindiniai bet kurios „JavaScript“ programos vykdymo darbo eigos skyriai: skambučių rinkinys, žiniatinklio API ir užduočių eilė..

Skambučių kaminas

Rietuvė yra duomenų struktūra, kurioje paskutinis pridėtas elementas visada yra pirmasis, kuris pašalinamas iš krūvos. Galite galvoti apie tai kaip plokštės krūvą, kurioje pirmiausia galima pašalinti tik pirmąją paskutinę pridėtą plokštę. Skambučių rinkinys yra tiesiog ne kas kita, kaip krūvos duomenų struktūra, kur atitinkamai vykdomos užduotys ar kodas.

Panagrinėkime žemiau pateiktą pavyzdį;

Šaltinis – https://youtu.be/8aGhZQkoFbQ

Kai skambinate funkcijai printSquare (), ji perkeliama į skambučių kaminą, funkcija printSquare () iškviečia kvadrato () funkciją. Kvadratinė () funkcija yra pastumiama į krūvą ir taip pat vadinama dauginimo () funkcija. Daugybos funkcija stumiama ant kamino. Kadangi dauginimo funkcija grįžta ir yra paskutinis dalykas, kuris buvo pastumtas į krūvą, pirmiausia išspręsta ir pašalinama iš krūvos, o po to eina funkcija square () ir tada printSquare () funkcija.

Žiniatinklio API

Štai kur vykdomas kodas, kurio nevaldo V8 variklis, kad „neužblokuotų“ pagrindinės vykdymo gijos. Kai skambučių rinkinys susiduria su žiniatinklio API funkcija, procesas nedelsiant perduodamas žiniatinklio API, kur jis vykdomas, ir atleidžiant skambučių kaminą atlikti kitas operacijas jo vykdymo metu.

Grįžkime prie aukščiau esančio „setTimeout“ pavyzdžio;

Kai paleidžiame kodą, pirmoji „console.log“ eilutė tampa stumiama į krūvą ir beveik iškart gauname savo išvestį, pasiekus skirtąjį laiką, laikmačius tvarko naršyklė ir jie nėra pagrindinės „V8“ programos įgyvendinimo dalis. , o ne „Web API“, atlaisvinant krūvą, kad jis galėtų atlikti kitas operacijas.

Kol laikas dar tebeveikia, rietuvė eina į priekį prie kitos veiksmų eilutės ir paleidžia paskutinę console.log, kuri paaiškina, kodėl mes išvedam ją prieš laikmačio išvestį. Kai laikmatis bus baigtas, kažkas atsitiks. Tuomet „console.log in“ laikmatis vėl stebuklingai pasirodo skambučių rinkinyje!

Kaip?

Renginių kilpa

Prieš aptardami įvykio ciklą, pirmiausia išnagrinėkime užduočių eilės funkciją.

Atgal į mūsų laiko intervalo pavyzdį, kai žiniatinklio API baigia vykdyti užduotį, ji ne tik automatiškai grąžina ją į skambučių kaminą. Tai eina į Užduočių eilė. 

Eilė yra duomenų struktūra, veikianti pagal principą „pirmas iš pirmo“, todėl uždaviniams įsitraukus į eilę, jie išeina ta pačia tvarka. Užduotys, kurias įvykdė žiniatinklio API ir kurios perkeliamos į užduočių eilę, tada grįžkite į skambučių kaminą, kad būtų išspausdinti jų rezultatai..

Bet palauk. KAS YRA RENGINIO LAPAS???

Šaltinis – https://youtu.be/8aGhZQkoFbQ

Įvykio ciklas yra procesas, kurio metu laukiama, kol skambučių šūsnis bus aiškus, prieš perduodant skambučius iš užduočių eilės į skambučių kaminą. Kai „Stack“ bus išvalytas, įvykių kilpa suaktyvins ir patikrins, ar užduočių eilėje nėra galimų atšaukimų. Jei tokių yra, jis stumia jį į skambučių kaminą, laukia, kol skambučių šūsnis vėl bus aiškus, ir pakartoja tą patį procesą.

Šaltinis – https://www.quora.com/How-does-an-event-loop-work/answer/Timothy-Maxwell

Aukščiau pateikta schema parodo pagrindinę darbo eigą tarp įvykio ciklo ir užduočių eilės.

Išvada

Nors tai yra labai paprastas įvadas, „JavaScript“ asinchroninio programavimo koncepcija suteikia pakankamai įžvalgos, kad būtų galima aiškiai suprasti, kas vyksta po gaubtu ir kaip „JavaScript“ sugeba veikti vienu metu ir asinchroniškai tik vienu gija..

„JavaScript“ visada yra paklausa, o jei jums įdomu sužinoti, patarčiau tai patikrinti Udemy kursas.

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me
    Like this post? Please share to your friends:
    Adblock
    detector
    map