„JavaScript“ programuotojai įpratę apsimesti lygiagretumu, tačiau yra būdas pasiekti tikrą paralelumą, kurį turėtumėte naudoti dabar.

„JavaScript“ gali susidoroti su daug našumu reikalaujančiomis užduotimis, nes tai vienos gijos kalba. Naudodami lygiagretumą galite pasiekti kelių gijų vykdymą „JavaScript“ ir pagerinti šiuolaikinių žiniatinklio programų našumą bei reagavimą.

Paralelizmas JavaScript programavimo srityje

Šiuolaikiniuose kompiuteriuose lygiagretumas yra labai svarbus siekiant pagerinti našumą ir mastelio keitimą. Jis tai daro efektyviai naudodamas turimus išteklius.

Dažnas metodas, naudojamas programavimo lygiagretumui pasiekti, yra kelių sriegių naudojimas. Tačiau „JavaScript“ gija yra vienos gijos sistema ir vienu metu gali atlikti tik vieną užduotį. Tai reiškia, kad jis nepažįsta lygiagrečių programų vykdymo.

„JavaScript“ klastotės lygiagretusis programavimas

Paplitusi klaidinga nuomonė apie lygiagretumą, kad jį galite pasiekti naudodami asinchroninio programavimo technika pvz., asinchronizavimas / laukimas, atgaliniai skambučiai ir pažadai:

// Async/wait funkcija, imituojanti tinklo užklausą
asyncfunkcijagauti duomenis() {
konst atsakymas = laukti atnešti();
konst duomenys = laukti atsakymas.json();
grąžinti duomenys;
}

// Atgalinio skambinimo funkcija, kuri registruoja gautus duomenis į konsolę
funkcijalogData(duomenis) {
konsolė.log (duomenys);
}

// Promise.all() metodas, kuris lygiagrečiai vykdo kelis pažadus
Pažadas.all([
fetchData (),
fetchData (),
]).tada((rezultatus) => {
konsolė.log (rezultatai);
});

// Iškvieskite funkciją „fetchData“ ir perduokite „logData“ funkciją kaip atgalinį iškvietimą
fetchData().tada (logData);

Šie metodai iš tikrųjų nevykdo kodo lygiagrečiai. „JavaScript“ naudoja įvykių kilpą, kad imituotų lygiagretųjį programavimą vienos gijos dizaine.

Įvykio ciklas yra pagrindinė „JavaScript“ vykdymo aplinkos dalis. Tai leidžia atlikti asinchronines operacijas, pvz., tinklo užklausas, fone, neužblokuojant pagrindinės vienos gijos.

Įvykių ciklas nuolat tikrina, ar eilėje nėra naujų įvykių ar užduočių, ir vykdo juos po vieną. Ši technika leidžia JavaScript pasiekti lygiagretumą ir teorinį lygiagretumą.

Lygiagretumas vs. Lygiagretumas

„JavaScript“ pasaulyje lygiagretumas ir lygiagretumas dažnai nesuprantami ir sukeičiami.

„JavaScript“ lygiagretumas reiškia galimybę atlikti kelias užduotis sutampant užduočių vykdymą. Kai viena užduotis gali prasidėti anksčiau nei baigiama kita, bet užduotys negali prasidėti ir baigtis vienu metu. Tai leidžia JavaScript efektyviai valdyti operacijas, pvz., duomenų gavimas iš REST API arba skaityti failus, neužblokuojant pagrindinės vykdymo gijos.

Kita vertus, lygiagretumas reiškia galimybę vienu metu atlikti kelias užduotis keliose gijose. Šios fono gijos gali atlikti užduotis nepriklausomai ir vienu metu. Tai atveria galimybes pasiekti tikrą paralelumą „JavaScript“ programose.

„JavaScript“ programos gali pasiekti tikrą lygiagretumą Web Workers naudojimas.

Žiniatinklio darbuotojai pristato „JavaScript“ lygiagretumą

Web Workers yra šiuolaikinių žiniatinklio naršyklių funkcija, leidžianti „JavaScript“ kodui paleisti foninėse gijose, atskirai nuo pagrindinės vykdymo gijos. Skirtingai nuo pagrindinės gijos, kuri tvarko vartotojo sąveiką ir vartotojo sąsajos atnaujinimus. Web Worker būtų skirtas daug skaičiavimo reikalaujančioms užduotims atlikti.

Žemiau pateikiama žiniatinklio darbuotojo veikimo schema JavaScript.

Pagrindinė gija ir žiniatinklio darbuotojas gali bendrauti naudodamas pranešimų perdavimą. Naudojant postMessage pranešimų siuntimo būdas ir žinute įvykių tvarkyklės, kad gautumėte pranešimus, galite perduoti instrukcijas ar duomenis pirmyn ir atgal.

Web darbuotojo kūrimas

Norėdami sukurti žiniatinklio darbuotoją, turite sukurti atskirą „JavaScript“ failą.

Štai pavyzdys:

// pagrindinis.js

// Sukurkite naują žiniatinklio darbuotoją
konst darbuotojas = naujas Darbuotojas („darbininkas.js“);

// Siųsti pranešimą žiniatinklio darbuotojui
worker.postMessage("Sveiki iš pagrindinės gijos!");

// Klausykite pranešimų iš žiniatinklio darbuotojo
darbuotojas.onmessage = funkcija(renginys) {
konsolė.log(„Gautas pranešimas iš žiniatinklio darbuotojo:“, renginys.duomenys);
};

Aukščiau pateiktame pavyzdyje sukuriamas naujas žiniatinklio darbuotojas, perduodamas kelią darbuotojo scenarijui (darbuotojas.js) kaip argumentą Darbininkas konstruktorius. Galite išsiųsti pranešimą žiniatinklio darbuotojui naudodami postMessage metodą ir klausykite pranešimų iš Web Worker naudodami žinute įvykių vedėjas.

Tada turėtumėte sukurti darbuotojo scenarijų (darbuotojas.js) failas:

// darbuotojas.js

// Klausykite pranešimų iš pagrindinės gijos
savarankiškai.onmessage = funkcija(renginys) {
konsolė.log(„Gauta žinutė iš pagrindinės gijos:“, renginys.duomenys);

// Siųsti žinutę atgal į pagrindinę giją
self.postMessage("Sveiki iš worker.js!");
};

Web Worker scenarijus klausosi pranešimų iš pagrindinės gijos naudodamas žinute įvykių vedėjas. Gavę pranešimą, atsijungiate nuo pranešimo viduje įvykis.duomenys ir nusiųskite naują pranešimą į pagrindinę giją su postMessage metodas.

Lygiagretumo panaudojimas su žiniatinklio darbuotojais

Pagrindinis žiniatinklio darbuotojų naudojimo atvejis yra lygiagrečiai vykdyti daug skaičiavimo reikalaujančias JavaScript užduotis. Perkeldami šias užduotis žiniatinklio darbuotojams, galite pasiekti reikšmingų našumo patobulinimų.

Štai pavyzdys, kaip naudojant žiniatinklio darbuotoją atlikti sudėtingą skaičiavimą:

// pagrindinis.js

konst darbuotojas = naujas Darbuotojas („darbininkas.js“);

// Siųsti duomenis į Web Worker apskaičiavimui
worker.postMessage([1, 2, 3, 4, 5]);

// Klausykite žiniatinklio darbuotojo rezultato
darbuotojas.onmessage = funkcija(renginys) {
konst rezultatas = įvykis.duomenys;
konsolė.log('Skaičiavimo rezultatas:', rezultatas);
};

Worker.js:

// Klausykite duomenų iš pagrindinės gijos
savarankiškai.onmessage = funkcija (renginys) {
konst skaičiai = įvykis.duomenys;

konst rezultatas = performHeavyCalculation (skaičiai);

// Nusiųskite rezultatą atgal į pagrindinę giją
self.postMessage (rezultatas);
};

funkcijaatliktiHeavyCalculation(duomenis) {
// Atlikite sudėtingą skaičių masyvo skaičiavimą
grąžinti duomenis
.map((numerį) =>Matematika.pow (skaičius, 3)) // Supjaustykite kiekvieną skaičių
.filtras((numerį) => skaičius % 20) // Filtruoti lyginius skaičius
.reduce((suma, skaičius) => suma + skaičius, 0); // Sumuokite visus skaičius
}

Šiame pavyzdyje jūs perduodate skaičių masyvą iš pagrindinės gijos žiniatinklio darbuotojui. Web Worker atlieka skaičiavimą naudodamas pateiktą duomenų masyvą ir siunčia rezultatą atgal į pagrindinę giją. The atliktiHeavyCalculation() funkcija susieja kiekvieną skaičių į kubą, išfiltruoja lyginius skaičius ir galiausiai juos susumuoja.

Apribojimai ir svarstymai

Nors žiniatinklio darbuotojai teikia „JavaScript“ lygiagretumo užtikrinimo mechanizmą, svarbu atsižvelgti į keletą apribojimų ir svarstymų:

  • Nėra bendros atminties: Web Workers veikia atskirose gijose ir nesidalija atmintimi su pagrindine gija. Taigi, jie negali tiesiogiai pasiekti kintamųjų ar objektų iš pagrindinės gijos, neperduodami pranešimo.
  • Serializavimas ir deserializavimas: Kai perduodate duomenis tarp pagrindinės gijos ir žiniatinklio darbuotojų, turite suskirstyti ir deserializuoti duomenis, nes pranešimas perduodamas tekstiniu ryšiu. Šis procesas kainuoja našumą ir gali turėti įtakos bendram programos našumui.
  • Naršyklės palaikymas: Nors žiniatinklio darbuotojai yra gerai palaikomi daugumoje šiuolaikinių žiniatinklio naršyklių, kai kurios senesnės naršyklės arba ribota aplinka gali iš dalies palaikyti žiniatinklio darbuotojus arba visai jo nepalaikyti.

Pasiekite tikrąjį „JavaScript“ lygiagretumą

„JavaScript“ lygiagretumas yra įdomi koncepcija, leidžianti tikrai vienu metu vykdyti užduotis, net ir kalbant apie vieną giją. Pristatę žiniatinklio darbuotojus galite pasinaudoti lygiagretumo galia ir pasiekti reikšmingų „JavaScript“ programų našumo patobulinimų.