Sužinokite, kaip panaudoti JavaScript Module Worker Threads paraleliams procesams, padidinti programų našumą ir sukurti jautresnes žiniatinklio bei Node.js programas.
JavaScript Module Worker Threads: Paralelinio apdorojimo galimybių atskleidimas siekiant didesnio našumo
Nuolat besikeičiančioje žiniatinklio ir programų kūrimo srityje nuolat auga poreikis greitesnėms, jautresnėms ir efektyvesnėms programoms. Viena iš pagrindinių technikų, kaip tai pasiekti, yra lygiagretus apdorojimas, leidžiantis užduotis vykdyti vienu metu, o ne nuosekliai. JavaScript, tradiciškai vienos gijos, siūlo galingą lygiagretinio vykdymo mechanizmą: Module Worker Threads.
Vienos gijos JavaScript apribojimų supratimas
JavaScript iš esmės yra vienos gijos. Tai reiškia, kad pagal numatytuosius nustatymus JavaScript kodas vykdomas po vieną eilutę, per vieną vykdymo giją. Nors šis paprastumas daro JavaScript gana lengvai išmokstamu ir suprantamu, jis taip pat kelia didelių apribojimų, ypač dirbant su skaičiavimo intensyviomis užduotimis ar I/O susijusiomis operacijomis. Kai ilgai veikianti užduotis blokuoja pagrindinę giją, tai gali sukelti:
- Vartotojo sąsajos užšalimas: Vartotojo sąsaja tampa nereaguojanti, todėl vartotojo patirtis yra prasta. Spustelėjimai, animacijos ir kitos interakcijos vėluojamos arba ignoruojamos.
- Našumo trukdžiai: Sudėtingi skaičiavimai, duomenų apdorojimas ar tinklo užklausos gali žymiai sulėtinti programą.
- Sumažėjęs jautrumas: Programa atrodo lėta ir jai trūksta modernioms žiniatinklio programoms būdingo sklandumo.
Įsivaizduokite vartotoją Tokijuje, Japonijoje, kuris naudojasi programa, atliekančia sudėtingą vaizdo apdorojimą. Jei tas apdorojimas blokuoja pagrindinę giją, vartotojas patirs didelį vėlavimą, todėl programa atrodys lėta ir erzins. Tai yra pasaulinė problema, su kuria susiduria vartotojai visur.
Module Worker Threads pristatymas: sprendimas lygiagretiniam vykdymui
Module Worker Threads suteikia galimybę perkelti skaičiavimo intensyvias užduotis iš pagrindinės gijos į atskiras darbininkų gijas. Kiekviena darbininkų gija savarankiškai vykdo JavaScript kodą, leidžiant lygiagretinį vykdymą. Tai žymiai pagerina programos jautrumą ir našumą. Module Worker Threads yra senesnės Web Workers API evoliucija, siūlanti keletą privalumų:
- Moduliškumas: Darbuotojai gali būti lengvai organizuojami į modulius naudojant `import` ir `export` teiginius, skatinant kodo pakartotinį naudojimą ir prižiūrimumą.
- Šiuolaikiniai JavaScript standartai: Pasinaudokite naujausiomis ECMAScript funkcijomis, įskaitant modulius, kad kodas būtų aiškesnis ir efektyvesnis.
- Node.js suderinamumas: Žymiai išplečia lygiagretinio apdorojimo galimybes Node.js aplinkose.
Iš esmės, darbininkų gijos leidžia jūsų JavaScript programai išnaudoti kelis CPU branduolius, leidžiant tikrąjį lygiagretumą. Pagalvokite apie tai kaip apie kelis virėjus virtuvėje (gijos), kiekvienas dirba prie skirtingų patiekalų (užduočių) tuo pačiu metu, todėl bendras patiekalų paruošimas (programos vykdymas) yra greitesnis.
Module Worker Threads sąranka ir naudojimas: praktinis vadovas
Pasigilinkime į tai, kaip naudoti Module Worker Threads. Tai apims tiek naršyklės, tiek Node.js aplinkas. Naudosime praktinius pavyzdžius, kad iliustruotume sąvokas.
Naršyklės aplinka
Naršyklės kontekste sukuriate darbininką, nurodydami JavaScript failo, kuriame yra darbininko kodas, kelią. Šis failas bus vykdomas atskiroje gijoje.
1. Darbininko scenarijaus kūrimas (worker.js):
// worker.js
import { parentMessage, calculateResult } from './utils.js';
self.onmessage = (event) => {
const { data } = event;
const result = calculateResult(data.number);
self.postMessage({ result });
};
2. Pagalbinio scenarijaus kūrimas (utils.js):
export const parentMessage = "Message from parent";
export function calculateResult(number) {
// Simulate a computationally intensive task
let result = 0;
for (let i = 0; i < number; i++) {
result += Math.sqrt(i);
}
return result;
}
3. Darbininko naudojimas jūsų pagrindiniame scenarijuje (main.js):
// main.js
const worker = new Worker('worker.js', { type: 'module' });
worker.onmessage = (event) => {
console.log('Result from worker:', event.data.result);
// Update the UI with the result
};
worker.onerror = (error) => {
console.error('Worker error:', error);
};
function startCalculation(number) {
worker.postMessage({ number }); // Send data to the worker
}
// Example: Initiate calculation when a button is clicked
const button = document.getElementById('calculateButton'); // Assuming you have a button in your HTML
if (button) {
button.addEventListener('click', () => {
const input = document.getElementById('numberInput');
const number = parseInt(input.value, 10);
if (!isNaN(number)) {
startCalculation(number);
}
});
}
4. HTML (index.html):
<!DOCTYPE html>
<html>
<head>
<title>Worker Example</title>
</head>
<body>
<input type="number" id="numberInput" placeholder="Enter a number">
<button id="calculateButton">Calculate</button>
<script type="module" src="main.js"></script>
</body>
</html>
Paaiškinimas:
- worker.js: Čia atliekamas didysis darbas. `onmessage` renginių klausytojas gauna duomenis iš pagrindinės gijos, atlieka skaičiavimą naudodamas `calculateResult` ir siunčia rezultatą atgal į pagrindinę giją naudodamas `postMessage()`. Atkreipkite dėmesį į `self` naudojimą vietoj `window` norint nurodyti globaliąją sritį darbininko viduje.
- main.js: Sukuria naują darbininko egzempliorių. `postMessage()` metodas siunčia duomenis darbininkui, o `onmessage` gauna duomenis atgal iš darbininko. `onerror` renginių tvarkytojas yra labai svarbus atliekant bet kokias klaidas darbininko gijoje.
- HTML: Pateikia paprastą vartotojo sąsają, kad būtų galima įvesti skaičių ir inicijuoti skaičiavimą.
Pagrindiniai aspektai naršyklėje:
- Saugos apribojimai: Darbininkai veikia atskiroje aplinkoje ir negali tiesiogiai pasiekti pagrindinės gijos DOM (Document Object Model). Ryšys vyksta per pranešimų perdavimą. Tai yra saugos funkcija.
- Duomenų perdavimas: Siunčiant duomenis į darbininkus ir iš jų, duomenys paprastai serijizuojami ir deserializuojami. Atsižvelkite į didelių duomenų perdavimo išlaidas. Norint klonuoti objektus ir išvengti duomenų modifikavimo problemų, apsvarstykite `structuredClone()` naudojimą.
- Naršyklės suderinamumas: Nors Module Worker Threads yra plačiai palaikomi, visada tikrinkite naršyklės suderinamumą. Naudokite funkcijų aptikimą, kad tinkamai tvarkytumėte situacijas, kai jie nepalaikomi.
Node.js aplinka
Node.js taip pat palaiko Module Worker Threads, siūlydamas lygiagretinio apdorojimo galimybes serverio pusės programose. Tai ypač naudinga CPU intensyvioms užduotims, tokioms kaip vaizdo apdorojimas, duomenų analizė ar didelio kiekio vienalaikių užklausų tvarkymas.
1. Darbininko scenarijaus kūrimas (worker.mjs):
// worker.mjs
import { parentMessage, calculateResult } from './utils.mjs';
import { parentPort, isMainThread } from 'node:worker_threads';
if (!isMainThread) {
parentPort.on('message', (data) => {
const result = calculateResult(data.number);
parentPort.postMessage({ result });
});
}
2. Pagalbinio scenarijaus kūrimas (utils.mjs):
export const parentMessage = "Message from parent in node.js";
export function calculateResult(number) {
// Simulate a computationally intensive task
let result = 0;
for (let i = 0; i < number; i++) {
result += Math.sqrt(i);
}
return result;
}
3. Darbininko naudojimas jūsų pagrindiniame scenarijuje (main.mjs):
// main.mjs
import { Worker, isMainThread } from 'node:worker_threads';
import { pathToFileURL } from 'node:url';
async function startWorker(number) {
return new Promise((resolve, reject) => {
const worker = new Worker(pathToFileURL('./worker.mjs').href, { type: 'module' });
worker.on('message', (result) => {
console.log('Result from worker:', result.result);
resolve(result);
worker.terminate();
});
worker.on('error', (err) => {
console.error('Worker error:', err);
reject(err);
});
worker.on('exit', (code) => {
if (code !== 0) {
console.error(`Worker stopped with exit code ${code}`);
reject(new Error(`Worker stopped with exit code ${code}`));
}
});
worker.postMessage({ number }); // Send data to the worker
});
}
async function main() {
if (isMainThread) {
const result = await startWorker(10000000); // Send a large number to the worker for calculation.
console.log("Calculation finished in main thread.")
}
}
main();
Paaiškinimas:
- worker.mjs: Panašiai kaip naršyklės pavyzdyje, šis scenarijus yra kodas, kuris bus vykdomas darbininko gijoje. Jis naudoja `parentPort` ryšiui su pagrindine gija. `isMainThread` yra importuojamas iš `node:worker_threads`, siekiant užtikrinti, kad darbininko scenarijus būtų vykdomas tik tada, kai jis neveikia kaip pagrindinė gija.
- main.mjs: Šis scenarijus sukuria naują darbininko egzempliorių ir siunčia jam duomenis naudodamas `worker.postMessage()`. Jis klausosi pranešimų iš darbininko naudodamas `'message'` renginį ir tvarko klaidas bei išeitis. `terminate()` metodas naudojamas darbininko gijai sustabdyti, kai skaičiavimai bus baigti, atlaisvinant išteklius. `pathToFileURL()` metodas užtikrina tinkamus failų kelius darbininko importavimui.
Pagrindiniai aspektai Node.js:
- Failų keliai: Įsitikinkite, kad darbininko scenarijaus ir visų importuojamų modulių keliai yra teisingi. Naudokite `pathToFileURL()` patikimam kelio nustatymui.
- Klaidų tvarkymas: Įdiekite tvirtą klaidų tvarkymą, kad užfiksuotumėte bet kokias išimtis, kurios gali kilti darbininko gijoje. `'error'` ir `'exit'` renginių klausytojai yra labai svarbūs.
- Išteklių valdymas: Nutraukite darbininkų gijas, kai jų nebereikia, kad atlaisvintumėte sistemos išteklius. Jei to nepadarysite, gali kilti atminties nutekėjimas arba našumo pablogėjimas.
- Duomenų perdavimas: Tie patys duomenų perdavimo (serijalizavimo išlaidų) aspektai, kaip ir naršyklėse, taikomi ir Node.js.
Module Worker Threads naudojimo privalumai
Module Worker Threads naudojimo privalumai yra daugybė ir jie turi didelį poveikį vartotojo patirčiai ir programos našumui:
- Pagerintas jautrumas: Pagrindinė gija išlieka jautri, net kai fone veikia skaičiavimo intensyvios užduotys. Tai lemia sklandesnę ir patrauklesnę vartotojo patirtį. Įsivaizduokite vartotoją Mumbajuje, Indijoje, naudojantį programą. Su darbininkų gijomis vartotojas nepatirs erzinaus įšalimo, kai atliekami sudėtingi skaičiavimai.
- Padidintas našumas: Lygiagretus vykdymas naudoja kelis CPU branduolius, leidžiant greičiau atlikti užduotis. Tai ypač pastebima programose, kurios apdoroja didelius duomenų rinkinius, atlieka sudėtingus skaičiavimus ar tvarko daugybę vienalaikių užklausų.
- Padidintas mastelis: Perduodant darbus darbininkų gijoms, programos gali aptarnauti daugiau vienalaikių vartotojų ir užklausų, nepabloginant našumo. Tai yra gyvybiškai svarbu verslui visame pasaulyje, turinčiam pasaulinę pasiekiamybę.
- Geresnė vartotojo patirtis: Jautri programa, kuri greitai reaguoja į vartotojo veiksmus, lemia didesnį vartotojų pasitenkinimą. Tai lemia didesnį įsitraukimą ir galiausiai verslo sėkmę.
- Kodo organizavimas ir prižiūrimumas: Moduliniai darbininkai skatina moduliškumą. Jūs galite lengvai pakartotinai naudoti kodą tarp darbininkų.
Išplėstinės technikos ir svarstymai
Be pagrindinio naudojimo, kelios išplėstinės technikos gali padėti jums maksimaliai išnaudoti Module Worker Threads privalumus:
1. Duomenų bendrinimas tarp gijų
Duomenų perdavimas tarp pagrindinės gijos ir darbininkų gijų apima `postMessage()` metodą. Sudėtingoms duomenų struktūroms apsvarstykite:
- Struktūrinis klonavimas: `structuredClone()` sukuria gilią objekto kopiją perdavimui. Tai padeda išvengti netikėtų duomenų modifikavimo problemų bet kurioje gijoje.
- Perduodami objektai: Dideliems duomenų perdavimams (pvz., `ArrayBuffer`) galite naudoti perduodamus objektus. Tai perduoda pagrindinių duomenų nuosavybę darbininkui, išvengiant kopijavimo išlaidų. Objektas tampa nenaudojamas originalioje gijoje po perdavimo.
Perduodamų objektų naudojimo pavyzdys:
// Main thread
const buffer = new ArrayBuffer(1024);
const worker = new Worker('worker.js', { type: 'module' });
worker.postMessage({ buffer }, [buffer]); // Transfers ownership of the buffer
// Worker thread (worker.js)
self.onmessage = (event) => {
const { buffer } = event.data;
// Access and work with the buffer
};
2. Darbininkų fondų valdymas
Darbininkų gijų kūrimas ir naikinimas dažnai gali būti brangus. Užduotims, kurios reikalauja dažnai naudoti darbininkus, apsvarstykite galimybę įdiegti darbininkų fondą. Darbininkų fondas palaiko iš anksto sukurtų darbininkų gijų rinkinį, kurios gali būti pakartotinai naudojamos užduotims atlikti. Tai sumažina gijų kūrimo ir naikinimo išlaidas, pagerindama našumą.
Konceptualus darbininkų fondų įgyvendinimas:
class WorkerPool {
constructor(workerFile, numberOfWorkers) {
this.workerFile = workerFile;
this.numberOfWorkers = numberOfWorkers;
this.workers = [];
this.queue = [];
this.initializeWorkers();
}
initializeWorkers() {
for (let i = 0; i < this.numberOfWorkers; i++) {
const worker = new Worker(this.workerFile, { type: 'module' });
worker.onmessage = (event) => {
const task = this.queue.shift();
if (task) {
task.resolve(event.data);
}
// Optionally, add worker back to a 'free' queue
// or allow the worker to stay active for the next task immediately.
};
worker.onerror = (error) => {
console.error('Worker error:', error);
// Handle error and potentially restart the worker
};
this.workers.push(worker);
}
}
async execute(data) {
return new Promise((resolve, reject) => {
this.queue.push({ resolve, reject });
const worker = this.workers.shift(); // Get a worker from the pool (or create one)
if (worker) {
worker.postMessage(data);
this.workers.push(worker); // Put worker back in queue.
} else {
// Handle case where no workers are available.
reject(new Error('No workers available in the pool.'));
}
});
}
terminate() {
this.workers.forEach(worker => worker.terminate());
}
}
// Example Usage:
const workerPool = new WorkerPool('worker.js', 4); // Create a pool of 4 workers
async function processData() {
const result = await workerPool.execute({ task: 'someData' });
console.log(result);
}
3. Klaidų tvarkymas ir derinimas
Darbininkų gijų derinimas gali būti sudėtingesnis nei vienos gijos kodas. Štai keletas patarimų:
- Naudokite `onerror` ir `error` renginius: Pritvirtinkite `onerror` renginių klausytojus prie savo darbininkų egzempliorių, kad užfiksuotumėte klaidas iš darbininko gijos. Node.js naudokite `error` renginį.
- Registravimas: Naudokite `console.log` ir `console.error` išsamiai tiek pagrindinėje gijoje, tiek darbininko gijoje. Įsitikinkite, kad žurnalai aiškiai diferencijuojami, kad būtų galima nustatyti, kuri gija juos generuoja.
- Naršyklės kūrėjų įrankiai: Naršyklės kūrėjų įrankiai (pvz., Chrome DevTools, Firefox Developer Tools) teikia žiniatinklio darbininkų derinimo galimybes. Galite nustatyti stabdymo taškus, apžiūrėti kintamuosius ir žingsniuoti per kodą.
- Node.js derinimas: Node.js teikia derinimo įrankius (pvz., naudojant `--inspect` vėliavėlę) darbininkų gijoms derinti.
- Kruopštus testavimas: Išsamiai testuokite savo programas, ypač skirtingose naršyklėse ir operacinėse sistemose. Testavimas yra labai svarbus pasauliniu mastu, siekiant užtikrinti funkcionalumą įvairiose aplinkose.
4. Dažniausių klaidų vengimas
- Užblokuojami procesai (Deadlocks): Įsitikinkite, kad jūsų darbininkai neužstringtų laukdami vienas kito (arba pagrindinės gijos), kad atlaisvintų išteklius, sukurdami užblokuotą situaciją. Atidžiai suprojektuokite savo užduočių eigą, kad išvengtumėte tokių scenarijų.
- Duomenų serijalizavimo išlaidos: Sumažinkite duomenų kiekį, kurį perduodate tarp gijų. Kai įmanoma, naudokite perduodamus objektus ir apsvarstykite galimybę grupuoti duomenis, kad sumažintumėte `postMessage()` skambučių skaičių.
- Išteklių vartojimas: Stebėkite darbininkų išteklių naudojimą (CPU, atminties), kad darbininkų gijos nesunaudotų per daug išteklių. Jei reikia, įdiekite tinkamus išteklių limitus ar nutraukimo strategijas.
- Sudėtingumas: Turėkite omenyje, kad lygiagretumo įvedimas padidina jūsų kodo sudėtingumą. Suprojektuokite savo darbininkus su aiškiu tikslu ir palaikykite kuo paprastesnį ryšį tarp gijų.
Naudojimo atvejai ir pavyzdžiai
Module Worker Threads randami įvairiausiose situacijose. Štai keletas svarbiausių pavyzdžių:
- Vaizdo apdorojimas: Perkeliant vaizdo dydžio keitimą, filtravimą ir kitus sudėtingus vaizdo manipuliavimus į darbininkų gijas. Tai išlaiko vartotojo sąsajos jautrumą, kol vaizdas apdorojamas fone. Įsivaizduokite pasauliniu mastu naudojamą nuotraukų bendrinimo platformą. Tai leistų vartotojams Rio de Žaneire, Brazilijoje, ir Londone, Jungtinėje Karalystėje, greitai įkelti ir apdoroti nuotraukas be jokių UI įšalimo.
- Vaizdo apdorojimas: Atlikti vaizdo kodavimą, dekodavimą ir kitus su vaizdo įrašais susijusius darbus darbininkų gijose. Tai leidžia vartotojams ir toliau naudoti programą, kol vyksta vaizdo apdorojimas.
- Duomenų analizė ir skaičiavimai: Perkelti skaičiavimo intensyvią duomenų analizę, mokslinius skaičiavimus ir mašininio mokymosi užduotis į darbininkų gijas. Tai pagerina programos jautrumą, ypač dirbant su dideliais duomenų rinkiniais.
- Žaidimų kūrimas: Paleisti žaidimo logiką, AI ir fizikos modeliavimą darbininkų gijose, užtikrinant sklandų žaidimą net ir su sudėtinga žaidimų mechanika. Populiarus internetinis žaidimas, pasiekiamas iš Seulo, Pietų Korėjos, turi užtikrinti minimalų vėlavimą žaidėjams. Tai gali būti pasiekta perkeliant fizikos skaičiavimus.
- Tinklo užklausos: Kai kurioms programoms galite naudoti darbininkus, kad vienu metu tvarkytumėte kelias tinklo užklausas, pagerindami bendrą programos našumą. Tačiau atkreipkite dėmesį į darbininkų gijų apribojimus, susijusius su tiesioginių tinklo užklausų atlikimu.
- Fono sinchronizavimas: Sinchronizuoti duomenis su serveriu fone neužblokavus pagrindinės gijos. Tai naudinga programoms, kurioms reikalingas veikimas neprisijungus arba kurios turi periodiškai atnaujinti duomenis. Mobilioji programa, naudojama Lagose, Nigerijoje, kuri periodiškai sinchronizuoja duomenis su serveriu, labai pasinaudos darbininkų gijomis.
- Didelių failų apdorojimas: Apdoroti didelius failus dalimis, naudojant darbininkų gijas, kad nebūtų užblokuota pagrindinė gija. Tai ypač naudinga tokioms užduotims kaip vaizdo įkėlimai, duomenų importavimas ar failų konvertavimas.
Geriausia praktika kuriant globaliai su Module Worker Threads
Kuriant su Module Worker Threads, skirtus globaliai auditorijai, apsvarstykite šias geriausias praktikas:
- Naršyklių suderinamumas: Kruopščiai testuokite savo kodą skirtingose naršyklėse ir skirtinguose įrenginiuose, kad užtikrintumėte suderinamumą. Atminkite, kad žiniatinklis pasiekiamas per įvairias naršykles, nuo Chrome JAV iki Firefox Vokietijoje.
- Našumo optimizavimas: Optimizuokite savo kodą našumui. Sumažinkite savo darbininkų scenarijų dydį, sumažinkite duomenų perdavimo išlaidas ir naudokite efektyvius algoritmus. Tai daro įtaką vartotojo patirčiai nuo Toronto, Kanados, iki Sidnėjaus, Australijos.
- Prieinamumas: Užtikrinkite, kad jūsų programa būtų prieinama neįgaliems vartotojams. Pateikite alternatyvų tekstą vaizdams, naudokite semantinį HTML ir laikykitės prieinamumo gairių. Tai taikoma vartotojams iš visų šalių.
- Internacionalizavimas (i18n) ir lokalizavimas (l10n): Apsvarstykite skirtingų regionų vartotojų poreikius. Išverskite savo programą į kelias kalbas, pritaikykite vartotojo sąsają skirtingoms kultūroms ir naudokite tinkamus datos, laiko ir valiutos formatus.
- Tinklo svarstymai: Atsižvelkite į tinklo sąlygas. Vartotojai, turintys lėtą interneto ryšį, patirs našumo problemas sunkiau. Optimizuokite savo programą, kad ji tvarkytų tinklo vėlavimą ir pralaidumo apribojimus.
- Saugumas: Apsaugokite savo programą nuo įprastų žiniatinklio pažeidžiamumų. Valykite vartotojo įvestį, apsisaugokite nuo tarpinių skriptų (XSS) atakų ir naudokite HTTPS.
- Testavimas įvairiose laiko juostose: Atlikite testavimą įvairiose laiko juostose, kad nustatytumėte ir išspręstumėte visas problemas, susijusias su laiko jautriomis funkcijomis ar fono procesais.
- Dokumentacija: Pateikite aiškią ir glaustą dokumentaciją, pavyzdžius ir vadovėlius anglų kalba. Apsvarstykite galimybę teikti vertimus plačiam įvaizdinti.
- Priimkite asinchroninį programavimą: Module Worker Threads yra sukurti asinchroniniam veikimui. Užtikrinkite, kad jūsų kodas efektyviai naudotų `async/await`, Promises ir kitus asinchroninius modelius, kad pasiektumėte geriausių rezultatų. Tai yra pagrindinė šiuolaikinio JavaScript sąvoka.
Išvada: priimti lygiagretumo galią
Module Worker Threads yra galingas įrankis JavaScript programų našumui ir jautrumui gerinti. Leisdami lygiagretų apdorojimą, jie leidžia kūrėjams perkelti skaičiavimo intensyvias užduotis iš pagrindinės gijos, užtikrinant sklandžią ir patrauklią vartotojo patirtį. Nuo vaizdo apdorojimo ir duomenų analizės iki žaidimų kūrimo ir fono sinchronizavimo, Module Worker Threads siūlo daugybę naudojimo atvejų įvairiose programose.
Suprasdami pagrindus, įvaldydami išplėstines technikas ir laikydamiesi geriausių praktikų, kūrėjai gali išnaudoti visą Module Worker Threads potencialą. Kadangi žiniatinklio ir programų kūrimas toliau vystosi, lygiagretumo galios priėmimas per Module Worker Threads bus būtinas kuriant našias, masteliuojamas ir patogias programas, atitinkančias pasaulinės auditorijos poreikius. Atminkite, kad tikslas yra sukurti programas, kurios veiktų sklandžiai, nepriklausomai nuo to, kur vartotojas yra planetoje – nuo Buenos Airių, Argentinos, iki Pekino, Kinijos.