(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': data().getTime(),įvykis:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-5LHNRP9'); Asinchroninis ir viengrandinis JavaScript? - The Codest
The Codest
  • Apie mus
  • Paslaugos
    • Programinės įrangos kūrimas
      • Priekinės dalies kūrimas
      • Galinės dalies kūrimas
    • Staff Augmentation
      • Priekinės dalies kūrėjai
      • Atgalinės versijos kūrėjai
      • Duomenų inžinieriai
      • Debesų inžinieriai
      • QA inžinieriai
      • Kita
    • Patariamoji tarnyba
      • Auditas ir konsultacijos
  • Pramonės šakos
    • Fintech ir bankininkystė
    • E-commerce
    • Adtech
    • Sveikatos technologijos
    • Gamyba
    • Logistika
    • Automobiliai
    • IOT
  • Vertė už
    • CEO
    • CTO
    • Pristatymo vadybininkas
  • Mūsų komanda
  • Case Studies
  • Sužinokite, kaip
    • Tinklaraštis
    • Susitikimai
    • Interneto seminarai
    • Ištekliai
Karjera Susisiekite su mumis
  • Apie mus
  • Paslaugos
    • Programinės įrangos kūrimas
      • Priekinės dalies kūrimas
      • Galinės dalies kūrimas
    • Staff Augmentation
      • Priekinės dalies kūrėjai
      • Atgalinės versijos kūrėjai
      • Duomenų inžinieriai
      • Debesų inžinieriai
      • QA inžinieriai
      • Kita
    • Patariamoji tarnyba
      • Auditas ir konsultacijos
  • Vertė už
    • CEO
    • CTO
    • Pristatymo vadybininkas
  • Mūsų komanda
  • Case Studies
  • Sužinokite, kaip
    • Tinklaraštis
    • Susitikimai
    • Interneto seminarai
    • Ištekliai
Karjera Susisiekite su mumis
Atgal rodyklė GRĮŽTI ATGAL
2020-09-02
Programinės įrangos kūrimas

Asinchroninis ir viengrandinis JavaScript?

Lukasz Kolko

JavaScript yra vienos gijos kalba, kuri kartu yra ir neblokinė, asinchroninė ir lygiagreti. Šiame straipsnyje paaiškinsime, kaip tai vyksta.

  • Vykdymo laikas

JavaScript yra interpretuojama, o ne kompiliuojama kalba. Tai reiškia, kad jai reikia interpretatoriaus, kuris konvertuoja JS kodas į mašininį kodą. Yra kelių tipų interpretatoriai (vadinamieji varikliai). Populiariausi naršyklių varikliai yra V8 ("Chrome"), Quantum ("Firefox") ir WebKit ("Safari"). Beje, V8 taip pat naudojamas populiarioje ne naršyklės paleidimo sistemoje, Node.js.

Kiekviename variklyje yra atminties krūva, skambučių stekas, įvykių ciklas, atgalinių skambučių eilė ir WebAPI su HTTP užklausomis, laikmačiais, įvykiais ir t. t. Visa tai įgyvendinta savaip, kad JS kodas būtų greičiau ir saugiau interpretuojamas.

JavaScript kūrimas

Pagrindinė JS paleidimo architektūra. Autorius: Autorius: Alex Zlatkov

Viena gija

Vienos gijos kalba - tai kalba su vienu iškvietimų kaminu ir viena atminties krūva. Tai reiškia, kad vienu metu joje vykdomas tik vienas dalykas.

A kamino yra ištisinė atminties sritis, kurioje kiekvienai vykdomai funkcijai priskiriamas vietinis kontekstas.

A krūva yra daug didesnis regionas, kuriame saugoma visa dinamiškai paskirstyta informacija.

A skambučių stekas yra duomenys struktūrą, kurioje iš esmės įrašoma, kurioje programos vietoje esame.

Skambučių stekas

Parašykime paprastą kodą ir stebėkime, kas vyksta skambučių steke.

JavaScript programinės įrangos kūrimas

Kaip matote, funkcijos įtraukiamos į steką, vykdomos ir vėliau ištrinamos. Tai vadinamasis LIFO būdas - paskutinis įeina, pirmas išeina. Kiekvienas skambučių steko įrašas vadinamas kamino rėmas.

Žinios apie iškvietimų steką yra naudingos skaitant klaidų steko pėdsakus. Paprastai tiksli klaidos priežastis yra pirmosios eilutės viršuje, nors kodo vykdymo tvarka yra iš apačios į viršų.

Kartais galite susidoroti su populiaria klaida, apie kurią pranešama Viršytas maksimalus skambučių kamino dydis. Tai lengva gauti naudojant rekursiją:

funkcija foo() {
    foo()
}
foo()

ir mūsų naršyklė arba terminalas užstringa. Kiekviena naršyklė, net ir skirtingos jų versijos, turi skirtingą skambučių kamino dydžio ribą. Daugeliu atvejų jų pakanka ir problemos reikėtų ieškoti kitur.

Užblokuotas skambučių stekas

Čia pateikiamas JS gijos blokavimo pavyzdys. Pabandykime perskaityti foo failą ir baras naudojant Mazgas.js sinchroninė funkcija readFileSync.

JavaScript kodas

Tai yra kilpinis GIF. Kaip matote, JS variklis laukia, kol bus atliktas pirmasis skambutis readFileSync baigtas. Tačiau tai neįvyks, nes nėra foo failą, todėl antroji funkcija niekada nebus iškviesta.

Asinchroninis elgesys

Tačiau JS taip pat gali neblokuoti ir elgtis taip, tarsi būtų daugiasluoksnė. Tai reiškia, kad ji nelaukia atsakymo į API iškvietimą, įvesties ir išvesties įvykius ir t. t., ir gali tęsti kodo vykdymą. Tai įmanoma dėl JS variklių, kuriuose naudojamos (po gaubtu) tikros daugiasluoksnės kalbos, pavyzdžiui, "C++" ("Chrome") arba "Rust" ("Firefox"). Jos suteikia mus su Tinklalapis API po naršyklės gaubtais arba pvz. I/O API po Node.js.

JavaScript programavimo kalba

Pirmiau pateiktame GIF paveikslėlyje matome, kad pirmoji funkcija perkeliama į iškvietimų steką ir Sveiki iš karto įvykdomas konsolėje.

Tada iškviečiame setTimeout funkcija, kurią teikia naršyklės WebAPI. Ji patenka į skambučių steką ir asinchroninį grįžtamąjį skambutį foo funkcija patenka į "WebApi" eilę, kur laukia skambučio, nustatyto po 3 sekundžių.

Tuo tarpu programa tęsia kodą ir mes matome Sveiki. Aš nesu užblokuotas konsolėje.

Po to, kai ji iškviečiama, kiekviena WebAPI eilėje esanti funkcija patenka į Atgalinių iškvietimų eilė. Čia funkcijos laukia, kol iškvietimų stekas bus tuščias. Kai tai įvyksta, jos ten perkeliamos viena po kitos.

Taigi, kai mūsų setTimeout laikmatis baigia skaičiuoti laiką, mūsų foo funkcija patenka į atgalinio iškvietimo eilę, laukia, kol iškvietimų stekas taps prieinamas, patenka į jį, įvykdoma ir matome Sveiki iš asinchroninio grįžtamojo ryšio konsolėje.

Įvykių ciklas

Kyla klausimas, kaip vykdymo laikas sužino, kad iškvietimų stekas tuščias, ir kaip įvykis iškviečiamas atgalinio ryšio eilėje? Susipažinkite su įvykių ciklu. Tai JS variklio dalis. Šis procesas nuolat tikrina, ar iškvietimų stekas tuščias, ir, jei taip, stebi, ar grįžtamojo ryšio eilėje yra įvykis, laukiantis iškvietimo.

Tai visa magija, slypinti užkulisiuose!

Teorijos apibendrinimas

Vientisumas ir lygiagretumas

Konkuravimas reiškia kelių užduočių vykdymą vienu metu, bet ne vienu metu. Pvz., dvi užduotys atliekamos sutampančiais laikotarpiais.

Lygiagretumas tai dviejų ar daugiau užduočių atlikimas vienu metu, pvz., kelių skaičiavimų atlikimas vienu metu.

Siūlai ir procesai

Siūlai yra kodo vykdymo seka, kuri gali būti vykdoma nepriklausomai viena nuo kitos.

Procesas yra veikiančios programos egzempliorius. Programa gali turėti kelis procesus.

Sinchroninis ir asinchroninis

Svetainėje sinchroninis programavimas, užduotys vykdomos viena po kitos. Kiekviena užduotis laukia, kol bus baigta ankstesnė užduotis, ir tik tada yra vykdoma.

Svetainėje asinchroninis programavimas, kai viena užduotis įvykdyta, galite pereiti prie kitos užduoties, nelaukdami, kol bus baigta ankstesnė.

Sinchroninis ir asinchroninis darbas vieno ir kelių gijų aplinkoje

Sinchroninis su viena gija: Užduotys vykdomos viena po kitos. Kiekviena užduotis laukia, kol bus įvykdyta ankstesnė užduotis.

Sinchroninis su keliais srautais: Užduotys vykdomos skirtingose gijose, tačiau laukiama, kol bet kurioje kitoje gijoje bus įvykdytos kitos užduotys.

Asinchroninis su viena gija: Užduotys pradedamos vykdyti nelaukiant, kol baigsis kita užduotis. Vienu metu gali būti vykdoma tik viena užduotis.

Asinchroninis su keliais srautais: Užduotys vykdomos skirtingais srautais, nelaukiant, kol bus užbaigtos kitos užduotys, ir baigiamos vykdyti nepriklausomai.

JavaScript klasifikacija

Jei atsižvelgsime į tai, kaip JS varikliai veikia po gaubtu, galime priskirti JS asinchroninei ir vieno sriegio interpretuojamai kalbai. Žodis “interpretuota” yra labai svarbus, nes jis reiškia, kad kalba visada priklausys nuo vykdymo laiko ir niekada nebus tokia greita kaip sukompiliuotos kalbos su integruotais keliais srautais.

Pažymėtina, kad Node.js gali pasiekti realų daugiasluoksniškumą, jei kiekviena gija paleidžiama kaip atskiras procesas. Tam yra bibliotekų, tačiau Node.js turi integruotą funkciją, vadinamą Darbuotojų gijos.

Visi įvykio kilpos GIF failai yra iš Lupa Philipo Robertso sukurtą programą, kurioje galite išbandyti asinchroninius scenarijus.

Skaityti daugiau:

Kodėl turėtumėte (tikriausiai) naudoti Typescript?

Pirmiausia kokybė! 5 paprasti žingsniai, kaip JavaScript projekte perbraižyti kodą naudojant "GitHub" darbo eigą

Kaip patobulinti Vue.js programas? Keletas praktinių patarimų

Susiję straipsniai

Išmaniojo telefono sveikatos priežiūros programėlės su širdies piktograma ir kylančia sveikatos diagrama, pažymėtos The Codest logotipu, iliustracija, vaizduojanti skaitmeninės sveikatos ir sveikatos technologijų sprendimus.
Programinės įrangos kūrimas

Sveikatos priežiūros programinė įranga: Sveikatos priežiūros paslaugos: tipai, naudojimo atvejai

Įrankiai, kuriais šiandien naudojasi sveikatos priežiūros organizacijos, nė iš tolo neprimena prieš kelis dešimtmečius naudotų popierinių kortelių. sveikatos priežiūros programinė įranga dabar padeda sveikatos sistemoms, pacientų priežiūrai ir šiuolaikiniam sveikatos priežiūros paslaugų teikimui klinikinėse ir...

GERIAUSIAS
Abstrakti mažėjančios stulpelinės diagramos su kylančia rodykle ir auksine moneta, simbolizuojančia ekonomiškumą arba taupymą, iliustracija. Viršutiniame kairiajame viršutiniame kampe pavaizduotas The Codest logotipas ir šūkis "In Code We Trust" šviesiai pilkame fone.
Programinės įrangos kūrimas

Kaip padidinti savo Dev komandą neprarandant produkto kokybės

Didinate savo kūrėjų komandą? Sužinokite, kaip augti neprarandant produkto kokybės. Šiame vadove aptariami ženklai, kad atėjo laikas didinti komandą, komandos struktūra, įdarbinimas, vadovavimas ir įrankiai - ir kaip The Codest gali...

GERIAUSIAS
Programinės įrangos kūrimas

Sukurkite ateičiai atsparias žiniatinklio programas: The Codest ekspertų komandos įžvalgos

Sužinokite, kaip The Codest puikiai kuria keičiamo dydžio interaktyvias žiniatinklio programas, naudodama pažangiausias technologijas ir užtikrindama vientisą naudotojų patirtį visose platformose. Sužinokite, kaip mūsų patirtis skatina skaitmeninę transformaciją ir verslo...

GERIAUSIAS
Programinės įrangos kūrimas

10 geriausių Latvijoje įsikūrusių programinės įrangos kūrimo įmonių

Naujausiame mūsų straipsnyje sužinokite apie geriausias Latvijos programinės įrangos kūrimo įmones ir jų inovatyvius sprendimus. Sužinokite, kaip šie technologijų lyderiai gali padėti pakelti jūsų verslo lygį.

thecodest
Įmonių ir didinimo sprendimai

"Java" programinės įrangos kūrimo pagrindai: A Guide to outsourcing Outsourcing Successfully

Išnagrinėkite šį esminį vadovą, kaip sėkmingai outsourcing "Java" programinę įrangą kurti, kad padidintumėte efektyvumą, įgytumėte patirties ir sėkmingai įgyvendintumėte projektus su The Codest.

thecodest

Prenumeruokite mūsų žinių bazę ir būkite nuolat informuoti apie IT sektoriaus patirtį.

    Apie mus

    The Codest - tarptautinė programinės įrangos kūrimo bendrovė, turinti technologijų centrus Lenkijoje.

    Jungtinė Karalystė - būstinė

    • 303B biuras, 182-184 High Street North E6 2JA
      Londonas, Anglija

    Lenkija - vietiniai technologijų centrai

    • Fabryczna biurų parkas, Aleja
      Pokoju 18, 31-564 Krokuva
    • Brain Embassy, Konstruktorska
      11, 02-673 Varšuva, Lenkija

    The Codest

    • Pagrindinis
    • Apie mus
    • Paslaugos
    • Case Studies
    • Sužinokite, kaip
    • Karjera
    • Žodynas

    Paslaugos

    • Patariamoji tarnyba
    • Programinės įrangos kūrimas
    • Galinės dalies kūrimas
    • Priekinės dalies kūrimas
    • Staff Augmentation
    • Atgalinės versijos kūrėjai
    • Debesų inžinieriai
    • Duomenų inžinieriai
    • Kita
    • QA inžinieriai

    Ištekliai

    • Faktai ir mitai apie bendradarbiavimą su išoriniu programinės įrangos kūrimo partneriu
    • Iš JAV į Europą: Kodėl Amerikos startuoliai nusprendžia persikelti į Europą?
    • Technikos plėtros centrų užsienyje palyginimas: Tech Offshore Europa (Lenkija), ASEAN (Filipinai), Eurazija (Turkija)
    • Kokie yra svarbiausi CTO ir CIO iššūkiai?
    • The Codest
    • The Codest
    • The Codest
    • Privacy policy
    • Website terms of use

    Autorinės teisės © 2026 The Codest. Visos teisės saugomos.

    lt_LTLithuanian
    en_USEnglish de_DEGerman sv_SESwedish da_DKDanish nb_NONorwegian fiFinnish fr_FRFrench pl_PLPolish arArabic it_ITItalian es_ESSpanish nl_NLDutch etEstonian elGreek pt_PTPortuguese cs_CZCzech lvLatvian is_ISIcelandic lt_LTLithuanian