JavaScript programeri navikli su glumiti paralelizam, ali postoji način za postizanje istinskog paralelizma koji biste upravo sada trebali koristiti.

JavaScript se može boriti sa zadacima koji zahtijevaju izvedbu jer je to jezik s jednom niti. Koristeći paralelizam, možete postići višenitno izvršavanje u JavaScriptu i poboljšati izvedbu i odziv vaših modernih web-aplikacija.

Paralelizam u JavaScript programiranju

Paralelizam je ključan u modernom računalstvu za poboljšanje performansi i skalabilnosti. To čini učinkovitim korištenjem dostupnih resursa.

Uobičajena tehnika koja se koristi za postizanje paralelizma u programiranju je višenitnost. Međutim, JavaScript nit je sustav s jednom niti i može obraditi samo jedan zadatak odjednom. To znači da nije upoznat s paralelnim izvršavanjem programa.

JavaScript lažira paralelno programiranje

Uobičajena zabluda o paralelizmu je da ga možete postići pomoću tehnike asinkronog programiranja poput async/await, povratnih poziva i obećanja:

// Async/await funkcija koja simulira mrežni zahtjev
instagram viewer

asinkronifunkcijadohvatiPodatke() {
konst odgovor = čekati dohvati();
konst podaci = čekati odgovor.json();
povratak podaci;
}

// Funkcija povratnog poziva koja bilježi dohvaćene podatke u konzolu
funkcijalogData(podaci) {
konzola.log (podaci);
}

// Metoda Promise.all() koja paralelno izvršava više obećanja
Obećanje.svi([
dohvatiPodatke(),
dohvatiPodatke(),
]).zatim((rezultate) => {
konzola.log (rezultati);
});

// Pozovite funkciju fetchData i proslijedite funkciju logData kao povratni poziv
dohvatiPodatke().zatim (logPodataka);

Ove tehnike zapravo ne izvršavaju paralelno kod. JavaScript koristi petlju događaja za oponašanje paralelnog programiranja unutar svojeg jednonitnog dizajna.

Petlja događaja temeljni je dio JavaScript runtime okruženja. Omogućuje vam izvršavanje asinkronih operacija, kao što su mrežni zahtjevi, u pozadini bez blokiranja glavne pojedinačne niti.

Petlja događaja stalno provjerava nove događaje ili zadatke u redu i izvršava ih jedan po jedan uzastopno. Ova tehnika omogućuje JavaScriptu postizanje konkurentnosti i teorijskog paralelizma.

Konkurencija vs. Paralelizam

Podudarnost i paralelizam često se krivo shvaćaju i zamjenjuju u svijetu JavaScripta.

Konkurentnost u JavaScriptu odnosi se na mogućnost izvršavanja više zadataka preklapanjem izvršenja zadataka. Gdje jedan zadatak može započeti prije nego što drugi završi, ali zadaci ne mogu niti započeti niti završiti istovremeno. Ovo omogućuje JavaScriptu da učinkovito upravlja operacijama, kao što je dohvaćanje podataka iz REST API-ja ili čitanje datoteka, bez blokiranja glavne izvršne niti.

Paralelizam se, s druge strane, odnosi na mogućnost izvršavanja više zadataka istovremeno u više niti. Ove pozadinske niti mogu izvršavati zadatke neovisno i istovremeno. To otvara mogućnosti za postizanje pravog paralelizma u JavaScript aplikacijama.

JavaScriptove aplikacije mogu postići pravi paralelizam putem korištenje Web Workersa.

Web radnici uvode paralelizam u JavaScript

Web radnici su značajka modernih web preglednika koja dopuštaju pokretanje JavaScript koda u pozadinskim nitima, odvojeno od glavne izvršne niti. Za razliku od glavne niti, koja obrađuje korisničke interakcije i ažuriranja korisničkog sučelja. Web Worker bi bio posvećen izvršavanju računalno intenzivnih zadataka.

Ispod je dijagram koji prikazuje rad web radnika u JavaScriptu.

Glavna nit i Web Worker mogu komunicirati putem prosljeđivanja poruka. Koristiti postMessage način slanja poruka i onmessage rukovatelj događajima za primanje poruka, možete prosljeđivati ​​upute ili podatke naprijed-natrag.

Stvaranje web radnika

Da biste izradili Web Worker, trebate izraditi zasebnu JavaScript datoteku.

Evo primjera:

// main.js

// Stvorite novog web radnika
konst radnik = novi Radnik('worker.js');

// Pošaljite poruku web radniku
worker.postMessage('Pozdrav iz glavne teme!');

// Slušajte poruke od Web Worker-a
radnik.onmessage = funkcija(događaj) {
konzola.log('Primljena poruka od Web Worker-a:', događaj.podaci);
};

Gornji primjer stvara novi Web Worker prosljeđivanjem staze do worker skripte (radnik.js) kao argument za Radnik konstruktor. Web Workeru možete poslati poruku pomoću postMessage metodu i slušajte poruke od Web Worker-a koristeći onmessage rukovatelj događajima.

Zatim biste trebali izraditi radnu skriptu (radnik.js) datoteka:

// radnik.js

// Slušati poruke iz glavne niti
self.onmessage = funkcija(događaj) {
konzola.log('Primljena poruka iz glavne niti:', događaj.podaci);

// Pošalji poruku natrag u glavnu nit
self.postMessage("Pozdrav iz worker.js!");
};

Skripta Web Worker osluškuje poruke iz glavne niti pomoću onmessage rukovatelj događajima. Nakon što primite poruku, odjavljujete se unutar poruke događaj.podatak i pošaljite novu poruku u glavnu nit s postMessage metoda.

Iskorištavanje paralelizma s web radnicima

Primarni slučaj upotrebe za Web Workers je paralelno izvršavanje računalno intenzivnih JavaScript zadataka. Prebacivanjem ovih zadataka na Web radnike, možete postići značajna poboljšanja performansi.

Evo primjera korištenja web worker-a za izvođenje teškog izračuna:

// main.js

konst radnik = novi Radnik('worker.js');

// Pošaljite podatke web radniku na izračun
worker.postMessage([1, 2, 3, 4, 5]);

// Slušajte rezultat Web Worker-a
radnik.onmessage = funkcija(događaj) {
konst rezultat = događaj.podaci;
konzola.log('Rezultat izračuna:', rezultat);
};

Worker.js:

// Slušati podatke iz glavne niti
self.onmessage = funkcija (događaj) {
konst brojevi = događaj.podaci;

konst rezultat = izvedi težak izračun (brojevi);

// Pošalji rezultat natrag u glavnu nit
self.postMessage (rezultat);
};

funkcijaizvesti težak izračun(podaci) {
// Izvođenje složenog izračuna na nizu brojeva
povratak podaci
.karta((broj) =>matematika.pow (broj, 3)) // Kockica svakog broja
.filtar((broj) => broj % 20) // Filtriranje parnih brojeva
.smanjiti((zbroj, broj) => zbroj + broj, 0); // Zbroj svih brojeva
}

U ovom primjeru prosljeđujete niz brojeva iz glavne niti u Web Worker. Web Worker izvodi izračun pomoću dobivenog niza podataka i šalje rezultat natrag u glavnu nit. The izvrši težak izračun() funkcija preslikava svaki broj u njegovu kocku, filtrira parne brojeve i na kraju ih zbraja.

Ograničenja i razmatranja

Iako Web Workers pružaju mehanizam za postizanje paralelizma u JavaScriptu, važno je uzeti u obzir nekoliko ograničenja i razmatranja:

  • Nema zajedničke memorije: Web radnici rade u zasebnim nitima i ne dijele memoriju s glavnom niti. Dakle, ne mogu izravno pristupiti varijablama ili objektima iz glavne niti bez prosljeđivanja poruka.
  • Serijalizacija i deserijalizacija: Kada prosljeđujete podatke između glavne niti i Web Workersa, morate serijalizirati i deserijalizirati podatke jer je prosljeđivanje poruka komunikacija temeljena na tekstu. Ovaj postupak uzrokuje troškove izvedbe i može utjecati na ukupnu izvedbu aplikacije.
  • Podrška za preglednik: Iako su Web Workersi dobro podržani u većini modernih web preglednika, neki stariji preglednici ili ograničena okruženja mogu imati djelomičnu ili nikakvu podršku za Web Workerse.

Postignite pravi paralelizam u JavaScriptu

Paralelizam u JavaScriptu uzbudljiv je koncept koji omogućuje istinsko istovremeno izvršavanje zadataka, čak iu primarno jednonitnom jeziku. Uz uvođenje Web Workersa, možete iskoristiti moć paralelizma i postići značajna poboljšanja performansi u svojim JavaScript aplikacijama.