JavaScript-ohjelmoijat ovat tottuneet teeskentelemään rinnakkaisuutta, mutta todellisen rinnakkaisuuden saavuttamiseen on olemassa keino, jota sinun pitäisi käyttää juuri nyt.
JavaScript voi kamppailla suorituskykyä vaativien tehtävien kanssa, koska se on yksisäikeinen kieli. Yhdensuuntaisuuden avulla voit saavuttaa JavaScriptin monisäikeisen suorituksen ja parantaa nykyaikaisten verkkosovellustesi suorituskykyä ja reagointikykyä.
Rinnakkaisuus JavaScript-ohjelmoinnissa
Rinnakkaisuus on ratkaisevan tärkeää nykyaikaisessa tietojenkäsittelyssä suorituskyvyn ja skaalautuvuuden parantamiseksi. Se tekee tämän hyödyntämällä käytettävissä olevia resursseja tehokkaasti.
Yleinen tekniikka, jota käytetään ohjelmoinnin rinnakkaisuuden saavuttamiseen, on monisäie. JavaScript-säie on kuitenkin yksisäikeinen järjestelmä ja voi käsitellä vain yhtä tehtävää kerrallaan. Tämä tarkoittaa, että se ei tunne rinnakkaisia ohjelmien suorituksia.
JavaScript väärennökset rinnakkaisohjelmointi
Yleinen väärinkäsitys rinnakkaisuudesta on, että voit saavuttaa sen käyttämällä
asynkroniset ohjelmointitekniikat kuten async/wait, takaisinsoittoja ja lupauksia:// Async/wait-toiminto, joka simuloi verkkopyyntöä
asynktoimintofetchData() {
konst vastaus = odottaa hae();
konst data = odottaa vastaus.json();
palata tiedot;
}// Takaisinsoittotoiminto, joka kirjaa haetut tiedot konsoliin
toimintologData(tiedot) {
konsoli.log (data);
}// Promise.all()-metodi, joka suorittaa useita lupauksia rinnakkain
Lupaus.kaikki([
fetchData(),
fetchData(),
]).sitten((tuloksia) => {
konsoli.log (tulokset);
});
// Kutsu fetchData-funktio ja välitä logData-funktio takaisinkutsuna
fetchData().then (logData);
Nämä tekniikat eivät itse asiassa suorita koodia rinnakkain. JavaScript käyttää tapahtumasilmukkaa matkimaan rinnakkaisohjelmointia yksisäikeisessä suunnittelussaan.
Tapahtumasilmukka on olennainen osa JavaScript-ajonaikaista ympäristöä. Sen avulla voit suorittaa asynkronisia toimintoja, kuten verkkopyyntöjä, taustalla estämättä pääsäiettä.
Tapahtumasilmukka tarkistaa jatkuvasti uusia tapahtumia tai tehtäviä jonossa ja suorittaa ne yksitellen peräkkäin. Tämän tekniikan avulla JavaScript voi saavuttaa samanaikaisuuden ja teoreettisen rinnakkaisuuden.
Samanaikaisuus vs. Rinnakkaisuus
Samanaikaisuus ja rinnakkaisuus ymmärretään usein väärin ja vaihdetaan JavaScript-maailmassa.
JavaScriptin samanaikaisuus tarkoittaa kykyä suorittaa useita tehtäviä päällekkäin tehtävien suorittamisen kanssa. Kun yksi tehtävä voi alkaa ennen kuin toinen valmistuu, mutta tehtävät eivät voi alkaa eivätkä päättyä samanaikaisesti. Tämä antaa JavaScriptille mahdollisuuden käsitellä toimintoja tehokkaasti, kuten tietojen hakeminen REST API: sta tai lukea tiedostoja estämättä pääsuoritussäiettä.
Toisaalta rinnakkaisuus viittaa kykyyn suorittaa useita tehtäviä samanaikaisesti useissa säikeissä. Nämä taustasäikeet voivat suorittaa tehtäviä itsenäisesti ja samanaikaisesti. Tämä avaa mahdollisuuksia todellisen rinnakkaisuuden saavuttamiseen JavaScript-sovelluksissa.
JavaScriptin sovellukset voivat saavuttaa todellisen rinnakkaisuuden Web Workersin käyttöä.
Verkkotyöntekijät esittelevät JavaScriptin rinnakkaisuuden
Web Workers ovat nykyaikaisten verkkoselaimien ominaisuus, joka sallii JavaScript-koodin ajamisen taustasäikeissä erillään pääsäikeestä. Toisin kuin pääsäie, joka käsittelee käyttäjien vuorovaikutusta ja käyttöliittymäpäivityksiä. Web Worker olisi omistautunut suorittamaan laskennallisesti vaativia tehtäviä.
Alla on kaavioesitys Web Workerin toiminnasta JavaScriptissä.
Pääsäie ja Web Worker voivat kommunikoida viestinvälityksen avulla. Käyttämällä postiviesti tapa lähettää viestejä ja viestissä tapahtumakäsittelijä vastaanottaa viestejä, voit välittää ohjeita tai tietoja edestakaisin.
Verkkotyöntekijän luominen
Luodaksesi Web Workerin, sinun on luotava erillinen JavaScript-tiedosto.
Tässä on esimerkki:
// main.js// Luo uusi Web Worker
konst työntekijä = Uusi Työntekijä("työntekijä.js");
// Lähetä viesti Web Workerille
worker.postMessage('Hei pääketjusta!');
// Kuuntele Web Workerin viestejä
worker.onmessage = toiminto(tapahtuma) {
konsoli.Hirsi('Vastaanotettu viesti Web Workerilta:', tapahtuma.data);
};
Yllä oleva esimerkki luo uuden Web Workerin välittämällä polun työntekijän komentosarjaan (worker.js) argumenttina Työntekijä rakentaja. Voit lähettää viestin Web Workerille käyttämällä postiviesti menetelmää ja kuuntele Web Workerin viestejä käyttämällä viestissä tapahtumakäsittelijä.
Luo sitten työskentelyohjelma (worker.js) tiedosto:
// työntekijä.js
// Kuuntele pääketjun viestejä
self.onmessage = toiminto(tapahtuma) {
konsoli.Hirsi('Vastaanotettu viesti pääketjusta:', tapahtuma.data);
// Lähetä viesti takaisin pääketjuun
self.postMessage("Hei worker.js: stä!");
};
Web Worker -skripti kuuntelee viestejä pääsäikeestä käyttämällä viestissä tapahtumakäsittelijä. Saatuasi viestin kirjaudut ulos sisällä olevasta viestistä event.data ja lähetä uusi viesti pääketjuun postiviesti menetelmä.
Parallelismin hyödyntäminen verkkotyöntekijöiden kanssa
Web Workersin ensisijainen käyttötapa on laskennallisesti vaativien JavaScript-tehtävien suorittaminen rinnakkain. Kun siirrät nämä tehtävät Web Workersille, voit saavuttaa merkittäviä suorituskyvyn parannuksia.
Tässä on esimerkki web-työntekijän käyttämisestä raskaan laskelman suorittamiseen:
// main.jskonst työntekijä = Uusi Työntekijä("työntekijä.js");
// Lähetä tiedot Web Workerille laskemista varten
worker.postMessage([1, 2, 3, 4, 5]);
// Kuuntele Web Workerin tulos
worker.onmessage = toiminto(tapahtuma) {
konst tulos = tapahtuma.data;
konsoli.Hirsi('Laskentatulos:', tulos);
};
Worker.js:
// Kuuntele tietoja pääsäikeestä
self.onmessage = toiminto (tapahtuma) {
konst numerot = tapahtuma.data;konst tulos = performHeavyCalculation (numerot);
// Lähetä tulos takaisin pääketjuun
self.postMessage (tulos);
};
toimintosuorittaaHeavyCalculation(tiedot) {
// Suorita monimutkainen laskutoimitus lukujoukolle
palata tiedot
.kartta((määrä) =>Matematiikka.pow (numero, 3)) // Kuutioi jokainen numero
.suodattaa((määrä) => numero % 20) // Suodata parilliset luvut
.vähentää((summa, numero) => summa + numero, 0); // Summaa kaikki luvut
}
Tässä esimerkissä välität numerojoukon pääsäikeestä Web Workerille. Web Worker suorittaa laskennan käyttämällä toimitettua tietojoukkoa ja lähettää tuloksen takaisin pääsäikeeseen. The suoritaHeavyCalculation() funktio kartoittaa jokaisen luvun sen kuutioon, suodattaa pois parilliset luvut ja lopuksi summaa ne.
Rajoitukset ja huomiot
Vaikka Web Workers tarjoaa mekanismin JavaScriptin samansuuntaisuuden saavuttamiseksi, on tärkeää ottaa huomioon muutamia rajoituksia ja huomioita:
- Ei jaettua muistia: Web Workers toimivat erillisissä säikeissä eivätkä jaa muistia pääsäikeen kanssa. Joten he eivät voi suoraan käyttää muuttujia tai objekteja pääsäikeestä ilman viestin välitystä.
- Serialisointi ja deserialisointi: Kun siirrät tietoja pääsäikeen ja Web Workersin välillä, sinun on sarjoitava ja deserialisoitava tiedot, koska viestien välitys on tekstipohjaista viestintää. Tästä prosessista aiheutuu suorituskustannuksia ja se voi vaikuttaa sovelluksen yleiseen suorituskykyyn.
- Selaimen tuki: Vaikka Web Workers ovat hyvin tuettuja useimmissa nykyaikaisissa verkkoselaimissa, joissakin vanhemmissa selaimissa tai rajoitetuissa ympäristöissä voi olla Web Workers -tukea osittain tai ei ollenkaan.
Saavuta todellinen rinnakkaisuus JavaScriptissä
JavaScriptin rinnakkaisuus on jännittävä konsepti, joka mahdollistaa tehtävien todellisen samanaikaisen suorittamisen jopa ensisijaisesti yksisäikeisessä kielessä. Web Workersin käyttöönoton myötä voit hyödyntää rinnakkaisuuden voimaa ja saavuttaa merkittäviä suorituskyvyn parannuksia JavaScript-sovelluksissasi.