1.1 Enkel draad
2.1 Die oproepstapel
2.2 Die Web API
2.3 The Event Loop
Wag, wat is dit? 'N Boekagtige definisie? ��
Die sleutelwoorde hier vir hierdie artikel is: enkel-threaded, nie-blokkerend, gelyktydig, en asynchrone.
'N Draad van uitvoering is die kleinste reeks geprogrammeerde instruksies wat onafhanklik deur 'n skeduleerder bestuur kan word. 'N Programmeringstaal is enkelgespat, dit beteken dat dit slegs een taak of bewerking op een slag kan verrig. Dit beteken dat dit 'n hele proses van begin tot einde sal uitvoer sonder dat die draad onderbreek of gestop word.
In teenstelling met meervoudige draadtale waar meerdere prosesse gelyktydig op verskillende drade uitgevoer kan word sonder om mekaar te blokkeer.
Maar wat beteken blokkering??
Daar is nie een definisie van blokkering nie; dit beteken eenvoudig dinge wat stadig op die draad loop. Nie-blokkering beteken dus dinge wat nie traag is nie.
Ontspan! Ons sal dit binnekort uitvind ��.
Gelyktydigheid beteken dat die kode gelyktydig met meer as een draad uitgevoer word.
Asinchroniese programmering beteken dat die kode in 'n gebeurtenislus loop. As daar 'n blokkering plaasvind, word die geleentheid begin. Die blokkeringskode bly aanhou sonder om die hoofuitvoeringsdraad te blokkeer. As die blokkeringskode klaar is, is dit die resultaat van die blokkeringsbewerking en word dit teruggestoot na die stapel.
Voordat ons verder gaan, kom ons bespreek die bogenoemde.
Maar die bogenoemde is nie presies bymekaar nie; hoe kan 'n enkele draadtaal nie-blokkerend, gelyktydig en asinkronies wees?
Die V8 doen twee belangrike dinge;
Toewysing van hope geheue
Uitvoeringskonteks vir oproepstapel
Ongelukkig was ons vermoede verkeerd. Die V8 het net een oproepstapel, dink aan die oproepstapel as die draad.
Een draad === een oproepstapel === een uitvoering op een slag.
Beeld – Hacker middag
Probeer dit uitvind deur 'n eenvoudige, maar alledaagse, asinchroniese kode te skryf en dit saam te ontleed.
Dit wil voorkom asof 'n ander draad ons gehelp het om die time-out uit te voer, want ons is redelik seker dat 'n draad slegs een enkele taak op enige tydstip kan uitvoer..
Kom ons kyk vinnig na die V8 Bronkode vir 'n rukkie.
Wag wat??!!! Daar is geen timerfunksies in V8 nie, geen DOM nie? Geen gebeure nie? Geen AJAX?…. Yeeeeessss!!!
'N Stapel is 'n datastruktuur waarin die laaste element wat bygevoeg is altyd die eerste is wat uit die stapel verwyder word. U kan dit as 'n stapel van 'n plaat beskou waarin slegs die eerste plaat wat laas bygevoeg is, eerste verwyder kan word. 'N Oproepstapel is eenvoudig niks anders as 'n stapeldatasstruktuur waar take of kodes dienooreenkomstig uitgevoer word nie.
Kom ons kyk na die onderstaande voorbeeld;
Bron – https://youtu.be/8aGhZQkoFbQ
As u die funksie printSquare () noem, word dit op die oproepstapel gedruk, en die funksie printSquare () noem die vierkantige () -funksie. Die vierkantige () -funksie word op die stapel gedruk en noem ook die vermenigvuldiging () -funksie. Die vermenigvuldigingsfunksie word op die stapel gedruk. Aangesien die vermenigvuldigingsfunksie terugkeer en die laaste ding is wat na die stapel gedruk is, word dit eers opgelos en word dit van die stapel verwyder, gevolg deur die vierkantige () -funksie en dan die drukSquare () -funksie.
Die Web API
Dit is hier waar kode wat nie deur die V8-enjin hanteer word nie, uitgevoer word om nie die hoofuitvoeringsdraad te blokkeer nie. Wanneer die Call Stack 'n web API-funksie teëkom, word die proses onmiddellik aan die Web API oorhandig, waar dit uitgevoer word en word die Call Stack bevry om ander bewerkings tydens die uitvoering daarvan uit te voer.
Kom ons gaan terug na ons setTimeout-voorbeeld hierbo;
As ons die kode gebruik, word die eerste console.log-lyn na die stapel gestoot en ons produksie word byna onmiddellik verkry; as ons by die time-out uitkom, word timers deur die blaaier gehanteer en vorm dit nie deel van V8 se kernimplementering nie; na die Web API plaas, en die stapel bevry sodat dit ander handelinge kan verrig.
Terwyl die time-out nog loop, gaan die stapel voort na die volgende aksie-lyn en word die laaste console.log uitgevoer, wat verklaar waarom ons die uitspraak voor die timer-uitset kry. Sodra die timer voltooi is, gebeur daar iets. Die console.log-in-timer verskyn dan weer magies in die oproepstapel!
Laat ons eers deur die funksie van die taakwette gaan voordat ons die gebeurtenislus bespreek.
Terug na ons voorbeeld van time-out, sodra die Web API klaar is met die uitvoering van die taak, druk dit nie net outomaties terug na die oproepstapel nie. Dit gaan na die Taakwaglys.
'N Tou is 'n datastruktuur wat volgens die First in First out-beginsel werk, en as take in die ry ingedruk word, kom hulle in dieselfde volgorde uit. Take wat deur die Web API's uitgevoer is, wat na die taakwaglys gestoot word, gaan dan terug na die oproepstapel om hul resultaat uit te druk.
Maar wag. WAT DIE HECK IS DIE GEBEURTENISLOP???
Die gebeurtenislus is 'n proses wat wag totdat die oproepstapel duidelik is voordat dit terugbel vanaf die taakwagter na die oproepstapel gedruk word. Sodra die stapel skoon is, aktiveer en kyk die gebeurtenislus na die taakwaglys vir beskikbare terugbel. As daar enige is, druk dit dit na die oproepstapel, wag totdat die oproepstapel weer duidelik is en herhaal dieselfde proses.
Bron – https://www.quora.com/How-does-an-event-loop-work/answer/Timothy-Maxwell
Die bostaande diagram demonstreer die basiese werkvloei tussen die Event Loop en die Task Queue.