Programerji JavaScript so navajeni ponarejati paralelizem, vendar obstaja način za dosego pravega paralelizma, ki bi ga morali uporabljati prav zdaj.
JavaScript se lahko spopada z opravili, ki zahtevajo veliko zmogljivost, ker je jezik z eno nitjo. Z uporabo paralelizma lahko dosežete večnitno izvajanje v JavaScriptu in izboljšate zmogljivost in odzivnost svojih sodobnih spletnih aplikacij.
Paralelizem v programiranju JavaScript
Paralelizem je v sodobnem računalništvu ključnega pomena za izboljšanje zmogljivosti in razširljivosti. To doseže z učinkovito uporabo razpoložljivih virov.
Običajna tehnika, ki se uporablja za doseganje paralelizma v programiranju, je večnitnost. Nit JavaScript pa je sistem z eno nitjo in lahko obravnava le eno nalogo naenkrat. To pomeni, da ne pozna vzporednega izvajanja programov.
JavaScript ponareja vzporedno programiranje
Pogosta napačna predstava o paralelizmu je, da ga lahko dosežete z uporabo tehnike asinhronega programiranja kot so async/await, povratni klici in obljube:
// Funkcija Async/await, ki simulira omrežno zahtevo
asinhfunkcijofetchData() {
konst odgovor = čakati prinesi();
konst podatki = čakati odziv.json();
vrnitev podatki;
}// Funkcija povratnega klica, ki beleži pridobljene podatke v konzolo
funkcijologData(podatke) {
konzola.log (podatki);
}// Metoda Promise.all(), ki vzporedno izvede več obljub
Obljuba.vse([
fetchData(),
fetchData(),
]).potem((rezultate) => {
konzola.log (rezultati);
});
// Pokliči funkcijo fetchData in posreduj funkcijo logData kot povratni klic
fetchData().then (logData);
Te tehnike dejansko ne izvajajo kode vzporedno. JavaScript uporablja zanko dogodkov za posnemanje vzporednega programiranja znotraj svoje enonitne zasnove.
Dogodkovna zanka je temeljni del izvajalnega okolja JavaScript. Omogoča vam izvajanje asinhronih operacij, kot so omrežne zahteve, v ozadju, ne da bi blokirali glavno posamezno nit.
Dogodkovna zanka nenehno preverja nove dogodke ali naloge v čakalni vrsti in jih izvaja eno za drugo zaporedno. Ta tehnika omogoča JavaScriptu, da doseže sočasnost in teoretično vzporednost.
Sočasnost vs. Paralelizem
Sočasnost in vzporednost sta v svetu JavaScripta pogosto napačno razumljena in zamenjana.
Sočasnost v JavaScriptu se nanaša na zmožnost izvajanja več nalog s prekrivanjem izvajanja nalog. Kjer se lahko eno opravilo začne, preden se drugo zaključi, vendar se opravila ne morejo niti začeti niti končati hkrati. To omogoča JavaScriptu učinkovito upravljanje operacij, kot je pridobivanje podatkov iz API-ja REST ali branje datotek, ne da bi blokirali glavno izvajalno nit.
Po drugi strani pa se paralelizem nanaša na zmožnost izvajanja več nalog hkrati v več nitih. Te niti v ozadju lahko izvajajo naloge neodvisno in hkrati. To odpira priložnosti za doseganje pravega paralelizma v aplikacijah JavaScript.
Aplikacije JavaScript lahko dosežejo pravi paralelizem prek uporaba spletnih delavcev.
Spletni delavci uvajajo paralelizem v JavaScript
Spletni delavci so značilnost sodobnih spletnih brskalnikov, ki omogočajo izvajanje kode JavaScript v nitih v ozadju, ločeno od glavne izvedbene niti. Za razliko od glavne niti, ki obravnava uporabniške interakcije in posodobitve uporabniškega vmesnika. Spletni delavec bi bil namenjen izvajanju računalniško intenzivnih nalog.
Spodaj je diagram, ki prikazuje delovanje spletnega delavca v JavaScriptu.
Glavna nit in spletni delavec lahko komunicirata s posredovanjem sporočil. Uporabljati postMessage način za pošiljanje sporočil in onmessage obdelovalnik dogodkov za prejemanje sporočil, lahko posredujete navodila ali podatke naprej in nazaj.
Ustvarjanje spletnega delavca
Če želite ustvariti Web Worker, morate ustvariti ločeno datoteko JavaScript.
Tukaj je primer:
// main.js// Ustvarite novega spletnega delavca
konst delavec = novo delavec('worker.js');
// Pošlji sporočilo spletnemu delavcu
worker.postMessage('Pozdravljeni iz glavne teme!');
// Poslušaj sporočila spletnega delavca
delavec.onmessage = funkcijo(dogodek) {
konzola.log('Prejeto sporočilo spletnega delavca:', dogodek.podatki);
};
Zgornji primer ustvari novega spletnega delavca s posredovanjem poti do skripta delavca (delavec.js) kot argument za Delavec konstruktor. Spletnemu delavcu lahko pošljete sporočilo z uporabo postMessage in poslušajte sporočila spletnega delavca z uporabo onmessage obdelovalec dogodkov.
Nato morate ustvariti delovni skript (delavec.js) mapa:
// delavec.js
// Poslušaj sporočila iz glavne niti
self.onmessage = funkcijo(dogodek) {
konzola.log('Prejeto sporočilo iz glavne niti:', dogodek.podatki);
// Pošlji sporočilo nazaj v glavno nit
self.postMessage("Pozdrav iz worker.js!");
};
Skript Web Worker posluša sporočila iz glavne niti z uporabo onmessage obdelovalec dogodkov. Ko prejmete sporočilo, se sporočilo znotraj odjavite event.data in pošljite novo sporočilo v glavno nit z postMessage metoda.
Izkoriščanje paralelizma s spletnimi delavci
Primarni primer uporabe za spletne delavce je vzporedno izvajanje računalniško intenzivnih nalog JavaScript. Če te naloge prenesete na spletne delavce, lahko dosežete znatne izboljšave zmogljivosti.
Tukaj je primer uporabe spletnega delavca za izvajanje težkega izračuna:
// main.jskonst delavec = novo delavec('worker.js');
// Pošlji podatke spletnemu delavcu za izračun
worker.postMessage([1, 2, 3, 4, 5]);
// Poslušajte rezultat spletnega delavca
delavec.onmessage = funkcijo(dogodek) {
konst rezultat = event.data;
konzola.log('Rezultat izračuna:', rezultat);
};
Worker.js:
// Poslušaj podatke iz glavne niti
self.onmessage = funkcijo (dogodek) {
konst številke = event.data;konst rezultat = izvede HeavyCalculation (številke);
// Pošlji rezultat nazaj v glavno nit
self.postMessage (rezultat);
};
funkcijoizvesti HeavyCalculation(podatke) {
// Izvedite zapleten izračun na nizu števil
vrnitev podatke
.zemljevid((število) =>matematika.pow (število, 3)) // Kocko vsako število
.filter((število) => število % 20) // Filtriraj soda števila
.zmanjšaj((vsota, število) => vsota + število, 0); // Seštej vsa števila
}
V tem primeru posredujete niz številk iz glavne niti v Web Worker. Spletni delavec izvede izračun z uporabo ponujenega niza podatkov in pošlje rezultat nazaj v glavno nit. The izvede HeavyCalculation() funkcija vsako število preslika v svojo kocko, filtrira soda števila in jih na koncu sešteje.
Omejitve in premisleki
Medtem ko spletni delavci zagotavljajo mehanizem za doseganje vzporednosti v JavaScriptu, je pomembno upoštevati nekaj omejitev in premislekov:
- Brez skupnega pomnilnika: spletni delavci delujejo v ločenih nitih in si ne delijo pomnilnika z glavno nitjo. Torej ne morejo neposredno dostopati do spremenljivk ali objektov iz glavne niti brez posredovanja sporočila.
- Serializacija in deserializacija: Pri posredovanju podatkov med glavno nitjo in spletnimi delavci morate podatke serializirati in deserializirati, saj je posredovanje sporočil besedilna komunikacija. Ta postopek povzroča stroške delovanja in lahko vpliva na splošno delovanje aplikacije.
- Podpora za brskalnik: Čeprav so spletni delavci dobro podprti v večini sodobnih spletnih brskalnikov, imajo nekateri starejši brskalniki ali omejena okolja morda delno ali nič podpore za spletne delavce.
Dosezite pravi paralelizem v JavaScriptu
Paralelizem v JavaScriptu je vznemirljiv koncept, ki omogoča resnično sočasno izvajanje nalog, tudi v pretežno enonitnem jeziku. Z uvedbo spletnih delavcev lahko izkoristite moč paralelizma in dosežete znatne izboljšave zmogljivosti v svojih aplikacijah JavaScript.