Hvernig virkar Event Loop í JavaScript?

Þó að það gæti kallað á ítarlegan skilning á tungumálum eins og C ++ og C til að skrifa framleiðslukóða í fullri stærð, þá er oft hægt að skrifa JavaScript með bara grunnskilningi á því hvað er hægt að gera með tungumálið.


Hugtök, eins og að senda svarhringingu í aðgerðir eða skrifa ósamstilltur kóða, eru oft ekki svo erfið í framkvæmd, sem gerir flestum JavaScript forriturum sama um það sem gerist undir hettunni. Þeim er bara sama um að skilja flækjurnar sem hafa djúpt dregið úr þeim af tungumálinu.

Sem JavaScript verktaki verður sífellt mikilvægara að skilja hvað raunverulega gerist undir hettunni og hvernig flest þessi flækjustig frá okkur virkar virkilega. Það hjálpar okkur að taka upplýstrar ákvarðanir sem geta aftur á móti aukið árangur kóða okkar harkalegur.

Þessi grein fjallar um eitt af mjög mikilvægu en sjaldan skildu hugtökum eða hugtökum í JavaScript. The AÐEINSLÖG!. 

Ekki er hægt að forðast að skrifa ósamstilltur kóða í JavaScript, en af ​​hverju þýðir kóði sem keyrir ósamstilltur raunverulega? þ.e.a.s.. Atburðarlykkjan

Áður en við getum skilið hvernig atburðarlykkjan virkar verðum við fyrst að skilja hvað JavaScript er og hvernig það virkar!

Hvað er JavaScript?

Áður en við höldum áfram langar mig að taka skref til baka í grunnatriðin. Hvað er JavaScript raunverulega? Við gætum skilgreint JavaScript sem;

JavaScript er háttsett, túlkað, stakt snittari, ósamstillt, samtímis tungumál.

Bíddu, hvað er þetta? Bókhætt skilgreining? ��

Við skulum brjóta það niður!

Leitarorðin hér varðandi þessa grein eru einþráður, ekki hindra, samtímis, og ósamstilltur.

Stakur þráður

Þráður til framkvæmdar er minnsta röð forritaðrar kennslu sem hægt er að stjórna sjálfstætt af tímaáætlun. Forritunarmál er eins þráður og þýðir að það getur aðeins framkvæmt eitt verkefni eða aðgerð í einu. Þetta þýðir að það myndi framkvæma heilt ferli frá upphafi til enda án þess að þráðurinn yrði rofinn eða stöðvaður.

Ólíkt margþráðum tungumálum þar sem hægt er að keyra marga ferla á nokkrum þræði samtímis án þess að hindra hvort annað.

Hvernig er hægt að hafa JavaScript með einum snittari og ekki hindra á sama tíma?

En hvað þýðir að hindra?

Ekki hindra

Það er engin ein skilgreining á að hindra; það þýðir einfaldlega hluti sem keyra hægt á þráðinn. Svo þýðir ekki að hindra hluti sem eru ekki hægt á þræðinum.

En bíddu, sagði ég að JavaScript keyrir á einum þráð? Og ég sagði það einnig hindra, sem þýðir að verkefni hlaupa hratt á hringitakkanum? En hvernig??? Hvernig væri þegar við rekum tímamæla? Lykkjur?

Slakaðu á! Við munum komast að því ��.

Samhliða

Samtímis þýðir að kóðinn er framkvæmdur samtímis af fleiri en einum þræði.

Allt í lagi, hlutirnir verða mjög skrýtið núna, hvernig er hægt að hafa JavaScript með einum snittari og vera samtímis? þ.e.a.s. að keyra kóðann sinn með fleiri en einum þræði?

Ósamstilltur

Ósamstilltur forritun þýðir að kóðinn keyrir í atburðarás. Þegar útilokað er að hefja atburðinn. Lokunarkóðinn heldur áfram að keyra án þess að loka fyrir aðalútfærsluþræði. Þegar lokunarkóðinn lýkur er biðröð afleiðing lokunaraðgerða og ýtir þeim aftur í stafla.

En JavaScript er með einn þráð? Hvað keyrir síðan þennan útilokunarlykil á meðan að láta aðra kóða í þræðinum ganga til framkvæmda?

Áður en við höldum áfram skulum við endurskoða ofangreint.

  • JavaScript er einn snittari
  • JavaScript er ekki bannað, þ.e.a.s hægt ferli hindra ekki framkvæmd þess
  • JavaScript er samtímis, þ.e.a.s. það keyrir kóðann sinn í fleiri en einum þræði á sama tíma
  • JavaScript er ósamstillt, þ.e.a.s. það keyrir blokka kóða einhvers staðar annars staðar.

En ofangreint bætir ekki nákvæmlega saman, hvernig getur eitt snittara tungumál verið ekki hindrað, samtímis og ósamstillt?

Við skulum fara aðeins dýpra, við skulum fara niður á JavaScript afturkreymisvélar, V8, kannski hefur það einhverja falda þræði sem við erum ekki meðvitaðir um.

V8 vél

V8 vélin er afkastamikil, opnunartími vél fyrir opinn hugbúnað fyrir samsetningar fyrir JavaScript skrifað í C ++ af Google. Flestir vafrar keyra JavaScript með V8 vélinni og jafnvel vinsæla hnúta umhverfi js notar það líka.

Á einfaldri ensku er V8 C ++ forrit, sem fær JavaScript kóða, tekur saman og keyrir það.

V8 gerir tvo megin hluti;

  • Úthlutun minni
  • Framkvæmd samhengis símtala

Því miður var grunur okkar rangur. V8 er með aðeins einn hringistakk, hugsaðu um hringistakkann sem þráðinn.

Einn þráður === einn símtala === einn framkvæmd í einu.

Mynd – Hacker hádegi

Þar sem V8 hefur aðeins einn símtalastöflu, hvernig keyrir JavaScript samtímis og ósamstilltur án þess að loka á aðal framkvæmdarþráðinn?

Við skulum reyna að komast að því með því að skrifa einfaldan en samt algengan ósamstilltur kóða og greina hann saman.

JavaScript keyrir hvern kóða línu fyrir línu, hver á eftir öðrum (einþráður). Eins og búist var við verður fyrsta línan prentuð í stjórnborðið hér, en af ​​hverju er síðasta línan prentuð fyrir tímakóða? Af hverju bíður framkvæmdaferlið ekki eftir tímakóða (lokun) áður en haldið er áfram að keyra síðustu línuna?

Einhver annar þráður virðist hafa hjálpað okkur að framkvæma þennan tíma þar sem við erum nokkuð viss um að þráður getur aðeins framkvæmt eitt verkefni hverju sinni..

Við skulum kíkja inn í V8 kóðinn í smá stund.

Bíddu ha??!!! Það eru engar tímastillingar í V8, engin DOM? Engir atburðir? Ekkert AJAX?…. Yeeeeessss!!!

Atburðir, DOM, tímamælar o.fl. eru ekki hluti af grunnframkvæmd JavaScript, JavaScript er í samræmi við forskriftir Ecma forskriftanna og ýmsum útgáfum af því er oft vísað til samkvæmt Ecma forskriftir forskriftar (ES X).

Framkvæmd vinnuflæðis

Viðburðir, tímamælar, Ajax beiðnir eru allar veittar á viðskiptavininum af vöfrum og eru oft kallaðar Web API. Það eru þau sem leyfa JavaScript að vera með einn snittara að hindra, samtímis og ósamstillta! En hvernig?

Það eru þrír helstu hlutar við framkvæmd verkflæðis fyrir hvaða JavaScript forrit sem er, hringitakkann, API á vefnum og verkefnakörið.

Útkallinn

Stakkur er gagnaskipulag þar sem síðasti þátturinn sem bætt var við er alltaf sá fyrsti sem fjarlægður er úr staflinum, þú gætir hugsað það sem stafla af plötu þar sem aðeins fyrsta plötuna sem var síðast bætt við er hægt að fjarlægja fyrst. A hringja stafla er einfaldlega ekkert nema stafla gögn uppbygging þar sem verkefni eða kóða er framkvæmt í samræmi við það.

Skoðum dæmið hér að neðan;

Heimild – https://youtu.be/8aGhZQkoFbQ

Þegar þú hringir í aðgerðina printSquare () er því ýtt á hringitakkann, prentunaraðgerðin printSquare () kallar ferninginn (). Ferningnum () er ýtt á stafla og kallar einnig margfeldið (). Margföldunaraðgerðinni er ýtt á stafla. Þar sem margföldunaraðgerðin skilar sér og er það síðasta sem var ýtt á stafla, leysist hún fyrst og hún er fjarlægð úr staflinum, síðan ferningur () aðgerðin og síðan prentSquare () aðgerðin.

Vefforritið

Þetta er þar sem kóði sem ekki er meðhöndlaður með V8 vélinni er keyrður til að „loka“ fyrir aðal framkvæmdarþráðinn. Þegar Call Stack kynnist API API aðgerð er ferlið strax afhent Web API, þar sem það er keyrt og frjáls Call Call Stack til að framkvæma aðrar aðgerðir meðan á framkvæmd hennar stendur.

Förum aftur til setTimeout dæmisins hér að ofan;

Þegar við keyrum kóðann verður fyrsta console.log línunni ýtt að staflinum og við fáum framleiðsluna nánast strax, þegar við komum til leikhlésins eru tímamælar meðhöndlaðir af vafra og eru ekki hluti af grunnútfærslu V8, það er ýtt í staðinn fyrir vefforritið og losaðu stafilinn svo hann gæti framkvæmt aðrar aðgerðir.

Á meðan tíminn er enn í gangi fer staflarinn yfir í næstu aðgerðarlínu og keyrir síðustu console.log, sem skýrir hvers vegna við fáum það fram áður en myndatöku framleiðir. Þegar tímamæliranum er lokið gerist eitthvað. Console.log inn þá teljarinn birtist með töfrum í hringitakkanum!

Hvernig?

Atburðarlykkjan

Áður en við ræðum atburðarlykkjuna, skulum við fyrst fara í gegnum aðgerðina í biðröðinni.

Aftur í tímasetningardæmið okkar, þegar Web API er klárað að framkvæma verkefnið, ýtir það ekki bara aftur í hringitakkinn sjálfkrafa. Það fer til Verkefni í biðröð. 

Biðröð er gagnaskipulag sem vinnur samkvæmt meginreglunni First in First out, þannig að þegar verkum er ýtt inn í biðröðina komast þau út í sömu röð. Verkefni sem framkvæmd hafa verið af vefforritinu, sem er ýtt á verkefna biðröð, fara síðan aftur í hringitakkann til að fá útkomu þeirra prentuð út.

En bíddu. HVAÐ HECK er atburður lykkja???

Heimild – https://youtu.be/8aGhZQkoFbQ

Atburðarlykkjan er ferli sem bíður þess að hringjasíminn verði skýr áður en svarhringingum er ýtt úr verkefnisröðinni í hringitakkann. Þegar staflinn er orðinn virkjar atburðarásin og kannar verkefnisröðina eftir tiltækum svarhringingum. Ef það eru einhverjir, ýtir það því að hringitakkanum, bíður þess að hringistakkinn verði hreinn aftur og endurtekur sama ferli.

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

Ofangreind skýringarmynd sýnir grunnflæðið milli Event Loop og verkefna biðröð.

Niðurstaða

Þó að þetta sé mjög grundvallar kynning, þá gefur hugtakið ósamstilltur forritun í JavaScript næga innsýn til að skilja skýrt hvað er að gerast undir hettunni og hvernig JavaScript er hægt að keyra samtímis og ósamstilltur með aðeins einum þráð..

JavaScript er alltaf eftirspurn og ef þú ert forvitinn um að læra myndi ég ráðleggja þér að kíkja á þetta Udemy námskeið.

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