Što je paralelizam u JavaScriptu?

Što je paralelizam u JavaScriptu?
Čitatelji poput vas podržavaju MUO. Kada kupite putem poveznica na našoj stranici, možemo zaraditi partnersku proviziju. Čitaj više.

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.





MAKEUSEOF VIDEO DANA POMICI SE ZA NASTAVAK SA SADRŽAJEM

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 function that simulates a network request 
async function fetchData() {
  const response = await fetch();
  const data = await response.json();
  return data;
}

// Callback function that logs the fetched data to the console
function logData(data) {
  console.log(data);
}

// Promise.all() method that executes multiple promises in parallel
Promise.all([
  fetchData(),
  fetchData(),
]).then((results) => {
  console.log(results);
});

// Call the fetchData function and pass the logData function as a callback
fetchData().then(logData);

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.





Konkurentnost nasuprot paralelizmu

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

usluga korisničkog profila sustava Windows 10 nije uspjela pri prijavi

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 koji omogućuju 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.

  Dijagram strelice tijeka operacije web-radnika

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.

radi li aplikacija želja doista

Evo primjera:

 // main.js 

// Create a new Web Worker
const worker = new Worker('worker.js');

// Send a message to the Web Worker
worker.postMessage('Hello from the main thread!');

// Listen for messages from the Web Worker
worker.onmessage = function(event) {
  console.log('Received message from Web Worker:', event.data);
};

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:

 // worker.js 

// Listen for messages from the main thread
self.onmessage = function(event) {
  console.log('Received message from main thread:', event.data);

  // Send a message back to the main thread
  self.postMessage("Hello from 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 

const worker = new Worker('worker.js');

// Send data to the Web Worker for calculation
worker.postMessage([1, 2, 3, 4, 5]);

// Listen for the result from the Web Worker
worker.onmessage = function(event) {
  const result = event.data;
  console.log('Calculation result:', result);
};

Worker.js:

zašto mi je internet na telefonu odjednom tako spor
 // Listen for data from the main thread 
self.onmessage = function (event) {
  const numbers = event.data;

  const result = performHeavyCalculation(numbers);

  // Send the result back to the main thread
  self.postMessage(result);
};

function performHeavyCalculation(data) {
  // Perform a complex calculation on the array of numbers
  return data
    .map((number) => Math.pow(number, 3)) // Cube each number
    .filter((number) => number % 2 === 0) // Filter even numbers
    .reduce((sum, number) => sum + number, 0); // Sum all numbers
}

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. Uvođenjem Web Workersa možete iskoristiti moć paralelizma i postići značajna poboljšanja performansi u svojim JavaScript aplikacijama.