The Codest
  • Om oss
  • Tjenester
    • Programvareutvikling
      • Frontend-utvikling
      • Backend-utvikling
    • Staff Augmentation
      • Frontend-utviklere
      • Backend-utviklere
      • Dataingeniører
      • Ingeniører i skyen
      • QA-ingeniører
      • Annet
    • Det rådgivende
      • Revisjon og rådgivning
  • Industrier
    • Fintech og bankvirksomhet
    • E-commerce
    • Adtech
    • Helseteknologi
    • Produksjon
    • Logistikk
    • Bilindustrien
    • IOT
  • Verdi for
    • ADMINISTRERENDE DIREKTØR
    • CTO
    • Leveransesjef
  • Vårt team
  • Casestudier
  • Vet hvordan
    • Blogg
    • Møter
    • Webinarer
    • Ressurser
Karriere Ta kontakt med oss
  • Om oss
  • Tjenester
    • Programvareutvikling
      • Frontend-utvikling
      • Backend-utvikling
    • Staff Augmentation
      • Frontend-utviklere
      • Backend-utviklere
      • Dataingeniører
      • Ingeniører i skyen
      • QA-ingeniører
      • Annet
    • Det rådgivende
      • Revisjon og rådgivning
  • Verdi for
    • ADMINISTRERENDE DIREKTØR
    • CTO
    • Leveransesjef
  • Vårt team
  • Casestudier
  • Vet hvordan
    • Blogg
    • Møter
    • Webinarer
    • Ressurser
Karriere Ta kontakt med oss
Pil tilbake GÅ TILBAKE
2020-03-31
Programvareutvikling

Asynkron og enkelttrådet JavaScript?

Lukasz Kolko

JavaScript er et enkelttrådet språk og samtidig også ikke-blokkerende, asynkront og samtidig. Denne artikkelen forklarer hvordan det skjer.

  • Kjøretid

JavaScript er et tolket språk, ikke et kompilert språk. Det betyr at det trenger en tolk som konverterer JS kode til en maskinkode. Det finnes flere typer tolker (såkalte motorer). De mest populære nettlesermotorene er V8 (Chrome), Quantum (Firefox) og WebKit (Safari). V8 brukes for øvrig også i en populær kjøretid som ikke er nettleser, Node.js.

Hver motor inneholder en minnebunke, en anropsstabel, en hendelsesløkke, en tilbakekallingskø og en WebAPI med HTTP-forespørsler, tidtakere, hendelser osv., alt implementert på sin egen måte for raskere og sikrere tolkning av JS-koden.

JavaScript-utvikling

Grunnleggende JS-arkitektur for kjøretid. Forfatter: Alex Zlatkov

Enkelttråd

Et språk med én tråd er et språk med én enkelt anropsstabel og én enkelt minnebunke. Det betyr at det bare kjører én ting om gangen.

A stabel er en kontinuerlig region i minnet som allokerer lokal kontekst for hver funksjon som kjøres.

A haug er en mye større region som lagrer alt som allokeres dynamisk.

A anropsstabel er en datastruktur som i utgangspunktet registrerer hvor vi befinner oss i programmet.

Anropsstabel

La oss skrive en enkel kode og følge med på hva som skjer i anropsstakken.

JavaScript programvareutvikling

Som du kan se, legges funksjonene til i stakken, utføres og slettes senere. Det er den såkalte LIFO-måten - Last In, First Out. Hver oppføring i anropsstakken kalles en stabelramme.

Kunnskap om anropsstakken er nyttig for å lese feilstakkspor. Vanligvis står den nøyaktige årsaken til feilen øverst i første linje, selv om rekkefølgen på kodeutførelsen er nedenfra og opp.

Noen ganger kan du håndtere en populær feil, varslet av Maksimal størrelse på anropsstakken overskredet. Det er enkelt å få til dette ved hjelp av rekursivitet:

funksjon foo() {
    foo()
}
foo()

og nettleseren eller terminalen vår fryser. Alle nettlesere, selv i ulike versjoner, har ulike grenser for størrelsen på anropsstakken. I de aller fleste tilfeller er de tilstrekkelige, og problemet bør søkes et annet sted.

Blokkert anropsstabel

Her er et eksempel på blokkering av JS-tråden. La oss prøve å lese en foo fil og en bar ved hjelp av Knutepunkt.js synkron funksjon readFileSync.

JavaScript-kode

Dette er en loopet GIF. Som du ser, venter JS-motoren til det første kallet i readFileSync er fullført. Men dette vil ikke skje fordi det ikke finnes noen foo filen, slik at den andre funksjonen aldri vil bli kalt.

Asynkron oppførsel

JS kan imidlertid også være ikke-blokkerende og oppføre seg som om den var flertrådet. Det betyr at den ikke venter på svar på API-kall, I/O-hendelser osv. og kan fortsette kodekjøringen. Dette er mulig takket være JS-motorene som (under panseret) bruker ekte flertrådede språk, som C++ (Chrome) eller Rust (Firefox). De gir oss Web API under nettleserens hette eller f.eks. I/O API under Node.js.

JavaScript programmeringsspråk

I GIF-en ovenfor kan vi se at den første funksjonen skyves til anropsstakken og Hei utføres umiddelbart i konsollen.

Deretter kaller vi setTimeout funksjon som tilbys av nettleserens WebAPI. Den går til anropsstakken og dens asynkrone tilbakekalling foo funksjonen går til WebApi-køen, hvor den venter på anropet, som er satt til å skje etter 3 sekunder.

I mellomtiden fortsetter programmet koden, og vi ser Hei. Jeg er ikke blokkert i konsollen.

Etter at den er påkalt, går hver funksjon i WebAPI-køen til Tilbakekallingskø. Det er her funksjonene venter til anropsstakken er tom. Når det skjer, flyttes de dit én etter én.

Så når vår setTimeout timeren fullfører nedtellingen, vil vår foo funksjonen går til tilbakekallingskøen, venter til anropsstakken blir tilgjengelig, går dit, blir utført, og vi ser Hei fra asynkron tilbakekalling i konsollen.

Hendelsessløyfe

Spørsmålet er hvordan kjøretiden vet at anropsstakken er tom, og hvordan hendelsen i tilbakekallingskøen blir påkalt? Møt hendelsesløkken. Det er en del av JS-motoren. Denne prosessen sjekker hele tiden om anropsstakken er tom, og hvis den er det, overvåker den om det finnes en hendelse i tilbakeringingskøen som venter på å bli påkalt.

Det er all magien bak kulissene!

Oppsummering av teorien

Samtidighet og parallellisme

Samtidighet betyr at flere oppgaver utføres samtidig, men ikke simultant. F.eks. to oppgaver som utføres i overlappende tidsperioder.

Parallellisme betyr å utføre to eller flere oppgaver samtidig, f.eks. å utføre flere beregninger samtidig.

Tråder og prosesser

Tråder er en sekvens av kodeutførelser som kan utføres uavhengig av hverandre.

Prosess er en instans av et program som kjører. Et program kan ha flere prosesser.

Synkron og asynkron

I synkron programmering utføres oppgavene etter hverandre. Hver oppgave venter på at en eventuell tidligere oppgave er fullført, og utføres først da.

I asynkron programmering, kan du bytte til en annen oppgave når en oppgave er utført, uten å vente på at den forrige skal bli ferdig.

Synkront og asynkront i et enkelt- og flertrådet miljø

Synkron med en enkelt tråd: Oppgavene utføres én etter én. Hver oppgave venter på at den forrige oppgaven skal bli utført.

Synkron med flere tråder: Oppgaver utføres i forskjellige tråder, men venter på andre oppgaver som utføres i en annen tråd.

Asynkron med én enkelt tråd: Oppgaver begynner å bli utført uten å vente på at en annen oppgave skal bli ferdig. På et gitt tidspunkt kan bare én oppgave utføres.

Asynkron med flere tråder: Oppgaver utføres i forskjellige tråder uten å vente på at andre oppgaver skal fullføres, og de fullfører oppgavene sine uavhengig av hverandre.

JavaScript-klassifisering

Hvis vi ser på hvordan JS-motorene fungerer under panseret, kan vi klassifisere JS som et asynkront og entrådet tolket språk. Ordet "tolket" er svært viktig fordi det betyr at språket alltid vil være kjøretidsavhengig og aldri like raskt som kompilerte språk med innebygd flertrådning.

Det er verdt å merke seg at Node.js kan oppnå reell multitråding, forutsatt at hver tråd startes som en separat prosess. Det finnes biblioteker for dette, men Node.js har en innebygd funksjon som heter Arbeidertråder.

Alle hendelsesloop-GIF-er kommer fra Lupe applikasjon laget av Philip Roberts, der du kan teste dine asynkrone scenarier.

Les mer om dette:

Hvorfor bør du (sannsynligvis) bruke Typescript?

Kvalitet først! 5 enkle trinn for å lint koden din med GitHub-arbeidsflyter i JavaScript-prosjektet

Hvordan forbedre Vue.js-apper? Noen praktiske tips

Relaterte artikler

Programvareutvikling

Bygg fremtidssikre webapper: Innsikt fra The Codests ekspertteam

Oppdag hvordan The Codest utmerker seg når det gjelder å skape skalerbare, interaktive webapplikasjoner med banebrytende teknologi som gir sømløse brukeropplevelser på tvers av alle plattformer. Finn ut hvordan ekspertisen vår driver digital transformasjon og...

THECODEST
Programvareutvikling

Topp 10 Latvia-baserte programvareutviklingsselskaper

I vår nyeste artikkel kan du lese mer om Latvias beste programvareutviklingsselskaper og deres innovative løsninger. Oppdag hvordan disse teknologilederne kan bidra til å løfte virksomheten din.

thecodest
Løsninger for bedrifter og oppskalering

Grunnleggende om Java-programvareutvikling: En guide til vellykket outsourcing

Utforsk denne viktige veiledningen om vellykket outsourcing av Java-programvareutvikling for å øke effektiviteten, få tilgang til ekspertise og drive frem prosjektsuksess med The Codest.

thecodest
Programvareutvikling

Den ultimate guiden til outsourcing i Polen

Den kraftige økningen i outsourcing i Polen er drevet av økonomiske, utdanningsmessige og teknologiske fremskritt, noe som fremmer IT-vekst og et forretningsvennlig klima.

TheCodest
Løsninger for bedrifter og oppskalering

Den komplette guiden til verktøy og teknikker for IT-revisjon

IT-revisjoner sørger for sikre, effektive og kompatible systemer. Les hele artikkelen for å lære mer om viktigheten av dem.

The Codest
Jakub Jakubowicz CTO og medgrunnlegger

Abonner på vår kunnskapsbase og hold deg oppdatert på ekspertisen fra IT-sektoren.

    Om oss

    The Codest - Internasjonalt programvareutviklingsselskap med teknologisentre i Polen.

    Storbritannia - Hovedkvarter

    • Kontor 303B, 182-184 High Street North E6 2JA
      London, England

    Polen - Lokale teknologisentre

    • Fabryczna Office Park, Aleja
      Pokoju 18, 31-564 Kraków
    • Brain Embassy, Konstruktorska
      11, 02-673 Warszawa, Polen

      The Codest

    • Hjem
    • Om oss
    • Tjenester
    • Casestudier
    • Vet hvordan
    • Karriere
    • Ordbok

      Tjenester

    • Det rådgivende
    • Programvareutvikling
    • Backend-utvikling
    • Frontend-utvikling
    • Staff Augmentation
    • Backend-utviklere
    • Ingeniører i skyen
    • Dataingeniører
    • Annet
    • QA-ingeniører

      Ressurser

    • Fakta og myter om samarbeid med en ekstern programvareutviklingspartner
    • Fra USA til Europa: Hvorfor velger amerikanske oppstartsbedrifter å flytte til Europa?
    • Sammenligning av Tech Offshore Development Hubs: Tech Offshore Europa (Polen), ASEAN (Filippinene), Eurasia (Tyrkia)
    • Hva er de største utfordringene for CTO-er og CIO-er?
    • The Codest
    • The Codest
    • The Codest
    • Retningslinjer for personver
    • Vilkår for bruk av nettstedet

    Opphavsrett © 2025 av The Codest. Alle rettigheter forbeholdt.

    nb_NONorwegian
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian jaJapanese ko_KRKorean es_ESSpanish nl_NLDutch etEstonian elGreek nb_NONorwegian