JavaScripti programmeerijad on harjunud paralleelsust teesklema, kuid tõelise paralleelsuse saavutamiseks on olemas viis, mida peaksite praegu kasutama.

JavaScript võib jõudlust nõudvate ülesannetega raskustes olla, kuna see on ühelõimeline keel. Paralleelsust kasutades saate saavutada JavaScriptis mitme lõimega täitmise ning parandada oma kaasaegsete veebirakenduste jõudlust ja reageerimisvõimet.

Paralleelsus JavaScripti programmeerimises

Paralleelsus on kaasaegses andmetöötluses jõudluse ja mastaapsuse parandamiseks ülioluline. Ta teeb seda olemasolevaid ressursse tõhusalt kasutades.

Levinud tehnika paralleelsuse saavutamiseks programmeerimisel on mitme keermestamine. JavaScripti lõim on aga ühe lõimega süsteem ja saab korraga hakkama ainult ühe ülesandega. See tähendab, et ta ei tunne paralleelsete programmide täitmist.

JavaScripti võltsitud paralleelprogrammeerimine

Levinud eksiarvamus paralleelsuse kohta on see, et saate seda saavutada kasutades asünkroonse programmeerimise tehnikad nagu asünkroonimine/ootus, tagasihelistamised ja lubadused:

// Asünkrooni/ootamise funktsioon, mis simuleerib võrgupäringut
asünkrfunktsioonitoo andmed() {
konst vastus = ootama tõmba();
konst andmed = ootama vastus.json();
tagasi andmed;
}

// Tagasihelistamise funktsioon, mis logib hangitud andmed konsooli
funktsioonilogData(andmeid) {
konsool.log (andmed);
}

// Promise.all() meetod, mis täidab paralleelselt mitut lubadust
Lubadus.all([
tooda andmed (),
tooda andmed (),
]).siis((tulemused) => {
konsool.log (tulemused);
});

// Kutsuge funktsioon fetchData ja edastage funktsioon logData tagasihelistamisena
tõmbaData().then (logData);

Need tehnikad ei käivita tegelikult koodi paralleelselt. JavaScript kasutab sündmuste tsüklit paralleelse programmeerimise jäljendamiseks oma ühelõimelises kujunduses.

Sündmustsükkel on JavaScripti käituskeskkonna põhiosa. See võimaldab teil teostada taustal asünkroonseid toiminguid, näiteks võrgupäringuid, ilma peamist üksikut lõime blokeerimata.

Sündmustsükkel kontrollib pidevalt uusi sündmusi või ülesandeid järjekorras ja täidab need järjestikku ükshaaval. See tehnika võimaldab JavaScriptil saavutada samaaegsust ja teoreetilise paralleelsuse.

Samaaegsus vs. Paralleelsus

Samaaegsust ja paralleelsust mõistetakse JavaScripti maailmas sageli valesti ja vahetatakse.

JavaScripti samaaegsus viitab võimele täita mitut ülesannet, kattudes ülesannete täitmisega. Kus üks ülesanne võib alata enne teise lõpetamist, kuid ülesanded ei saa alata ega lõppeda samaaegselt. See võimaldab JavaScriptil toiminguid tõhusalt hallata, näiteks andmete toomine REST API-st või failide lugemist ilma peamist täitmislõimi blokeerimata.

Paralleelsus seevastu viitab võimalusele täita mitut toimingut üheaegselt mitme lõime kaudu. Need taustalõimed saavad ülesandeid täita iseseisvalt ja samaaegselt. See avab võimalused tõelise paralleelsuse saavutamiseks JavaScripti rakendustes.

JavaScripti rakendused võivad saavutada tõelise paralleelsuse veebitöötajate kasutamine.

Veebitöötajad tutvustavad JavaScripti paralleelsust

Veebitöötajad on kaasaegsete veebibrauserite funktsioon, mis lubab JavaScripti koodi taustalõimedes käitada, eraldi peamisest täitmislõimest. Erinevalt põhilõimest, mis tegeleb kasutaja interaktsioonide ja kasutajaliidese värskendustega. Veebitöötaja oleks pühendunud arvutusmahukate ülesannete täitmisele.

Allpool on diagrammi esitus veebitöötaja toimimisest JavaScriptis.

Põhilõim ja veebitöötaja saavad suhelda sõnumiedastuse abil. Kasutades postisõnum sõnumite saatmise meetod ja sõnumis sündmuste käitleja sõnumite vastuvõtmiseks, saate juhiseid või andmeid edasi-tagasi edastada.

Veebitöötaja loomine

Web Workeri loomiseks peate looma eraldi JavaScripti faili.

Siin on näide:

// main.js

// Looge uus veebitöötaja
konst tööline = uus Töötaja("töötaja.js");

// Saada sõnum veebitöötajale
worker.postMessage('Tere põhilõimest!');

// Veebitöötaja sõnumite kuulamine
töötaja.onmessage = funktsiooni(sündmus) {
konsool.log(„Web Workerilt saadud sõnum:”, sündmus.andmed);
};

Ülaltoodud näide loob uue veebitöötaja, edastades tee töötaja skriptile (töötaja.js) argumendina Tööline konstruktor. Saate saata veebitöötajale sõnumi, kasutades postisõnum meetodit ja kuulake Web Workeri sõnumeid kasutades sõnumis sündmuste käitleja.

Seejärel peaksite looma töötaja skripti (töötaja.js) fail:

// töötaja.js

// Kuulake põhilõime sõnumeid
ise.onmessage = funktsiooni(sündmus) {
konsool.log("Saadud sõnum põhilõimest:", sündmus.andmed);

// Saada sõnum tagasi põhilõime
self.postMessage("Tere saidilt worker.js!");
};

Web Workeri skript kuulab põhilõime sõnumeid kasutades sõnumis sündmuste käitleja. Sõnumi saamisel logite sees olevast sõnumist välja sündmus.andmed ja saatke põhilõimele uus sõnum postisõnum meetod.

Paralleelsuse võimendamine veebitöötajatega

Veebitöötajate peamine kasutusjuhtum on arvutusmahukate JavaScripti ülesannete paralleelne täitmine. Kui laadite need ülesanded veebitöötajatele välja, saate jõudlust oluliselt parandada.

Siin on näide veebitöötaja kasutamisest raske arvutuse tegemiseks:

// main.js

konst tööline = uus Töötaja("töötaja.js");

// Andmete saatmine veebitöötajale arvutamiseks
worker.postMessage([1, 2, 3, 4, 5]);

// Kuulake Web Workeri tulemust
töötaja.onmessage = funktsiooni(sündmus) {
konst tulemus = sündmus.andmed;
konsool.log('Arvutuse tulemus:', tulemus);
};

Worker.js:

// Kuulake andmeid põhilõimest
ise.onmessage = funktsiooni (sündmus) {
konst numbrid = sündmus.andmed;

konst tulemus = performHeavyCalculation (numbrid);

// Saada tulemus tagasi põhilõime
self.postMessage (tulemus);
};

funktsioonisooritada HeavyCalculation(andmeid) {
// Tehke arvude massiivi põhjal kompleksarvutus
tagasi andmeid
.map((number) =>matemaatika.pow (number, 3)) // Kuubi iga number
.filter((number) => arv % 20) // Paarisarvude filtreerimine
.reduce((summa, arv) => summa + arv, 0); // Summa kõik arvud
}

Selles näites edastate põhilõimest veebitöötajale arvude massiivi. Veebitöötaja teostab arvutuse, kasutades antud andmemassiivi ja saadab tulemuse tagasi põhilõime. The soorita HeavyCalculation() funktsioon vastendab iga arvu oma kuubikuga, filtreerib paarisarvud välja ja summeerib need lõpuks.

Piirangud ja kaalutlused

Kuigi veebitöötajad pakuvad mehhanismi JavaScripti paralleelsuse saavutamiseks, on oluline arvestada mõne piirangu ja kaalutlusega.

  • Ühismälu puudub: Veebitöötajad töötavad eraldi lõimedes ega jaga mälu põhilõimega. Seega ei pääse nad põhilõime muutujatele või objektidele otse juurde ilma sõnumi edastamiseta.
  • Serialiseerimine ja deserialiseerimine: kui edastate andmeid põhilõime ja veebitöötajate vahel, peate andmed serialiseerima ja deserialiseerima, kuna sõnumite edastamine on tekstipõhine suhtlus. Selle protsessiga kaasnevad jõudluskulud ja see võib mõjutada rakenduse üldist toimivust.
  • Brauseri tugi: Kuigi enamikus kaasaegsetes veebibrauserites on Web Workerid hästi toetatud, võivad mõned vanemad brauserid või piiratud keskkonnad toetada veebitöötajaid osaliselt või üldse mitte.

Saavutage JavaScriptis tõeline paralleelsus

Paralleelsus JavaScriptis on põnev kontseptsioon, mis võimaldab ülesannete tõelist samaaegset täitmist isegi peamiselt ühelõimelises keeles. Veebitöötajate kasutuselevõtuga saate kasutada paralleelsuse võimsust ja saavutada oma JavaScripti rakenduste jõudluse märkimisväärseid täiustusi.