JavaScript programmētāji ir pieraduši viltot paralēlismu, taču ir veids, kā panākt patiesu paralēlismu, kas jums vajadzētu izmantot tieši tagad.

JavaScript var cīnīties ar uzdevumiem, kas prasa intensīvu darbību, jo tā ir viena pavediena valoda. Izmantojot paralēlismu, varat sasniegt daudzpavedienu izpildi JavaScript un uzlabot savu moderno tīmekļa lietotņu veiktspēju un atsaucību.

Paralēlisms JavaScript programmēšanā

Paralēlismam ir izšķiroša nozīme mūsdienu skaitļošanā, lai uzlabotu veiktspēju un mērogojamību. Tas tiek darīts, efektīvi izmantojot pieejamos resursus.

Izplatīts paņēmiens, ko izmanto, lai programmēšanas laikā panāktu paralēlismu, ir vairāku vītņu izmantošana. Tomēr JavaScript pavediens ir viena pavediena sistēma un vienlaikus var apstrādāt tikai vienu uzdevumu. Tas nozīmē, ka tas nav pazīstams ar paralēlu programmu izpildi.

JavaScript viltojumi paralēlā programmēšana

Izplatīts nepareizs priekšstats par paralēlismu ir tāds, ka to var panākt, izmantojot asinhronās programmēšanas metodes piemēram, asinhronizācija/gaidīšana, atzvani un solījumi:

instagram viewer
// Asinhronā/gaidīšanas funkcija, kas simulē tīkla pieprasījumu
asinhronsfunkcijufetchData() {
konst atbilde = gaidīt atnest();
konst dati = gaidīt response.json();
atgriezties dati;
}

// Atzvanīšanas funkcija, kas reģistrē ienestos datus konsolē
funkcijulogData(datus) {
konsole.log (dati);
}

// Promise.all() metode, kas izpilda vairākus solījumus paralēli
Apsolīt.all([
fetchData (),
fetchData (),
]).tad((rezultātus) => {
konsole.log (rezultāti);
});

// Izsauciet funkciju fetchData un nododiet logData funkciju kā atzvanīšanu
fetchData().tad (logData);

Šīs metodes faktiski neizpilda kodu paralēli. JavaScript izmanto notikumu cilpu, lai atdarinātu paralēlo programmēšanu viena pavediena dizainā.

Notikumu cilpa ir būtiska JavaScript izpildlaika vides sastāvdaļa. Tas ļauj izpildīt asinhronas darbības, piemēram, tīkla pieprasījumus, fonā, nebloķējot galveno vienu pavedienu.

Notikumu cilpa pastāvīgi pārbauda, ​​vai rindā nav jaunu notikumu vai uzdevumu, un izpilda tos pa vienam pēc kārtas. Šis paņēmiens ļauj JavaScript sasniegt vienlaicīgumu un teorētisko paralēlismu.

Vienlaicība vs. Paralēlisms

JavaScript pasaulē vienlaicīgums un paralēlisms bieži tiek pārprasti un savstarpēji aizstāti.

JavaScript vienlaicība attiecas uz spēju izpildīt vairākus uzdevumus, pārklājoties ar uzdevumu izpildi. Kur viens uzdevums var sākties pirms cita pabeigšanas, bet uzdevumi nevar ne sākties, ne beigties vienlaicīgi. Tas ļauj JavaScript efektīvi apstrādāt darbības, piemēram, datu iegūšana no REST API vai lasot failus, nebloķējot galveno izpildes pavedienu.

No otras puses, paralēlisms attiecas uz spēju izpildīt vairākus uzdevumus vienlaikus vairākos pavedienos. Šie fona pavedieni var veikt uzdevumus neatkarīgi un vienlaikus. Tas paver iespējas panākt patiesu paralēlismu JavaScript lietojumprogrammās.

JavaScript lietojumprogrammas var sasniegt patiesu paralēlismu, izmantojot Web Workers izmantošana.

Tīmekļa darbinieki ievieš JavaScript paralēlismu

Web Workers ir modernu tīmekļa pārlūkprogrammu līdzeklis, kas ļauj JavaScript kodam darboties fona pavedienos atsevišķi no galvenā izpildes pavediena. Atšķirībā no galvenā pavediena, kas apstrādā lietotāju mijiedarbības un lietotāja saskarnes atjauninājumus. Web darbinieks būtu veltīts skaitļošanas ietilpīgu uzdevumu veikšanai.

Zemāk ir diagramma, kurā attēlota tīmekļa darbinieka darbība JavaScript.

Galvenais pavediens un tīmekļa darbinieks var sazināties, izmantojot ziņojumu nodošanu. Izmantojot postZiņojums ziņojumu sūtīšanas metode un ziņojumā notikumu apstrādātājs, lai saņemtu ziņojumus, varat nosūtīt norādījumus vai datus uz priekšu un atpakaļ.

Web darbinieka izveide

Lai izveidotu Web Worker, jums ir jāizveido atsevišķs JavaScript fails.

Šeit ir piemērs:

// main.js

// Izveidojiet jaunu Web Worker
konst strādnieks = jauns strādnieks("darbinieks.js");

// Nosūtiet ziņojumu tīmekļa darbiniekam
worker.postMessage('Sveiki no galvenā pavediena!');

// Klausieties ziņojumus no tīmekļa darbinieka
darbinieks.onmessage = funkciju(notikumu) {
konsole.log("Saņemts ziņojums no tīmekļa darbinieka:", notikums.dati);
};

Iepriekš minētajā piemērā tiek izveidots jauns tīmekļa darbinieks, nododot ceļu uz darbinieka skriptu (darbinieks.js) kā argumentu Strādnieks konstruktors. Varat nosūtīt ziņojumu tīmekļa darbiniekam, izmantojot postZiņojums metodi un klausieties ziņojumus no Web Worker, izmantojot ziņojumā notikumu apstrādātājs.

Pēc tam jums jāizveido darbinieka skripts (darbinieks.js) fails:

// darbinieks.js

// Klausieties ziņas no galvenā pavediena
self.onmessage = funkciju(notikumu) {
konsole.log("Saņemts ziņojums no galvenā pavediena:", notikums.dati);

// Nosūtīt ziņojumu atpakaļ uz galveno pavedienu
self.postMessage("Sveiks no worker.js!");
};

Web Worker skripts klausās ziņojumus no galvenā pavediena, izmantojot ziņojumā notikumu apstrādātājs. Saņemot ziņojumu, jūs izrakstāties no ziņojuma iekšpusē notikums.dati un nosūtiet jaunu ziņojumu galvenajam pavedienam ar postZiņojums metodi.

Paralēlisma izmantošana ar tīmekļa darbiniekiem

Primārais tīmekļa darbinieku lietojuma gadījums ir skaitļošanas ietilpīgu JavaScript uzdevumu izpilde paralēli. Izkraujot šos uzdevumus tīmekļa darbiniekiem, varat sasniegt ievērojamus veiktspējas uzlabojumus.

Šeit ir piemērs tīmekļa darbinieka izmantošanai, lai veiktu smagu aprēķinu:

// main.js

konst strādnieks = jauns strādnieks("darbinieks.js");

// Nosūtiet datus Web Worker aprēķinam
worker.postMessage([1, 2, 3, 4, 5]);

// Klausieties Web Worker rezultātu
darbinieks.onmessage = funkciju(notikumu) {
konst rezultāts = notikums.dati;
konsole.log('Aprēķina rezultāts:', rezultāts);
};

Worker.js:

// Klausieties datus no galvenā pavediena
self.onmessage = funkciju (notikumu) {
konst skaitļi = notikums.dati;

konst rezultāts = performHeavyCalculation (skaitļi);

// Nosūtiet rezultātu atpakaļ uz galveno pavedienu
self.postMessage (rezultāts);
};

funkcijuveikt HeavyCalculation(datus) {
// Veiciet kompleksu aprēķinu skaitļu masīvam
atgriezties datus
.map((numuru) =>Matemātika.pow (skaitlis, 3)) // Sagrieziet katru numuru
.filter((numuru) => skaits % 20) // Filtrēt pāra skaitļus
.reduce((summa, skaitlis) => summa + skaitlis, 0); // Summējiet visus skaitļus
}

Šajā piemērā jūs nosūtāt skaitļu masīvu no galvenā pavediena tīmekļa darbiniekam. Web darbinieks veic aprēķinu, izmantojot sniegto datu masīvu, un nosūta rezultātu atpakaļ uz galveno pavedienu. The veiktHeavyCalculation() funkcija kartē katru skaitli tā kubā, filtrē pāra skaitļus un visbeidzot tos summē.

Ierobežojumi un apsvērumi

Lai gan Web Workers nodrošina mehānismu JavaScript paralēlisma nodrošināšanai, ir svarīgi ņemt vērā dažus ierobežojumus un apsvērumus:

  • Nav koplietotas atmiņas: Web Workers darbojas atsevišķos pavedienos un nedala atmiņu ar galveno pavedienu. Tātad viņi nevar tieši piekļūt mainīgajiem vai objektiem no galvenā pavediena, nenododot ziņojumu.
  • Serializācija un deserializācija: Nododot datus starp galveno pavedienu un Web Workers, jums ir jāveic datu serializācija un deserializācija, jo ziņojumu nosūtīšana ir uz tekstu balstīta saziņa. Šis process rada veiktspējas izmaksas un var ietekmēt lietotnes vispārējo veiktspēju.
  • Pārlūka atbalsts: Lai gan vairums moderno tīmekļa pārlūkprogrammu Web Workers ir labi atbalstīti, dažas vecās pārlūkprogrammas vai ierobežotas vides var daļēji vai vispār neatbalstīt tīmekļa darbiniekus.

Sasniedziet patiesu paralēlismu JavaScript

Paralēlisms JavaScript ir aizraujošs jēdziens, kas nodrošina patiesu vienlaicīgu uzdevumu izpildi pat galvenokārt viena pavediena valodā. Ieviešot Web Workers, varat izmantot paralēlisma spēku un panākt ievērojamus JavaScript lietojumprogrammu veiktspējas uzlabojumus.