Sisseehitatud mälu tutvustus JavaScriptis
Jagatud mälu on JavaScripti täiustatud omadus, et niidid (samaaegselt teostatud osad) võivad võimendada. Mäluvahendite jagamine ei ole probleeme uuendatud andmete edastamisega keermete vahel ja kõik niidid saavad juurdepääsu ja uuendada ühiseid mällu samu andmeid.
Kas see pole armas? Noh, peaaegu. Selles postituses näeme kuidas kasutada jagatud mälu JavaScriptis ja kuidas otsustada, kas see on see, mida sa tõesti tahad teha.
Ühismälu eelised ja puudused
Me kasutame veebitöötajad kuni luua JavaScriptis lõime. Veebitöötajate API võimaldab meil luua töövõtjaid, mida saab kasutada täitke kood taustal nii, et põhitööriista saaks vabalt jätkata selle täitmist, võib-olla töötlema kasutajaliidese sündmusi, tagades kasutajaliidese külmutamise.
Töötajate niidid jooksma samaaegselt peakeermega ja üksteisega. Sellise ülesande erinevate osade üheaegne teostamine on aja säästmine. Te lõpetate kiiremini, kuid sellel on ka oma probleemid.
Veenduge, et iga niit saab vajalikud vahendid ja suhtleb omavahel õigeaegselt on ülesanne iseenesest, kui vigastus võib põhjustada üllatavat tulemust. Või kui üks lõime muudab andmeid ja teine loeb seda samal ajal, mida te arvate, mida teine lõng näeb? Uuendatud või vanad andmed?
Kuid veebitöötajad ei ole nii kergesti keeratavad. Sõnumite kaudu edastamise ajal on nende poolt edastatavad andmed mitte originaal, vaid koopia, tähendab, et nad seda ei tee jagada samad andmed. Nad edastada andmete koopiad üksteisele kui vaja.
Kuid jagamine on hooliv ja mitmed niidid võivad vajada samal ajal samade andmete vaatamist ja muutmist. Nii et, jagamise keelamine on suur no-no. See on koht, kus SharedArrayBuffer
objekt tuleb pildile. See laseb meil jagada binaarandmeid mitme niidi vahel.
The SharedArrayBuffer
objekti
Selle asemel, et andmete koopiaid keermete vahel edasi anda, siis me edastada koopiad SharedArrayBuffer
objekti. A SharedArrayBuffer
objekti viitab mälule, kuhu andmed salvestatakse.
Niisiis, isegi kui koopiad SharedArrayBuffer
need liiguvad keermete vahel, nad kõik jäävad samale mälule salvestatakse algandmed. Niisiis saavad niidid vaadata ja uuendada samas mälus olevaid andmeid.
Veebitöötajad ilma jagatud mälu
Me näeme, kuidas veebitöötaja jagatud mälu kasutamata töötab luua töötaja niit ja edastada mõned andmed.
The index.html
failil on põhiskript sees silt, nagu näete allpool:
const w = uus töötaja ('worker.js'); var n = 9; w.postMessage (n);
The worker.js
fail kannab töötaja skript:
onmessage = (e) => console.group ('[töötaja]); console.log ('Peavõngast saadud andmed:% i', e.data); console.groupEnd ();
Kasutades ülaltoodud koodi, saame järgmist väljund konsoolis:
[töötaja] Põhisõnast saadud andmed: 9
Eespool nimetatud postitusi veebitöötajatel saate lugeda ülaltoodud väljavõtete täieliku koodi selgitamiseks.
Praegu pidage meeles, et andmed on saadetakse lõimede vahel edasi-tagasi kasutades postMessage ()
meetod. Andmed on poolt vastu võetud sõnum
sündmuste käitleja, sündmuse väärtuseks andmeid
vara.
Nüüd, kui me muuta kas see ilmub vastuvõtu lõpus uuendatud? Vaatame:
const w = uus töötaja ('worker.js'); var n = 9; w.postMessage (n); n = 1;
Nagu oodatud, andmeid mitte uuendatud:
[töötaja] Põhisõnast saadud andmed: 9
Miks see ikkagi oleks? See on ainult kloon, mis saadeti töötajale põhiskriptist.
Veebitöötajad koos jagatud mälu
Nüüd, me tahame kasuta SharedArrayBuffer
objekti samas näites. Me saame luua uue SharedArrayBuffer
näiteks kasutades uus
märksõna. Konstruktor võtab ühe parameetri; a pikkuse väärtus baitides, täpsustades puhvri suuruse.
const w = uus töötaja ('worker.js'); buff = new SharedArrayBuffer (1); var arr = uus Int8Array (buff); / * seadistusandmed * / arr [0] = 9; / * puhvri (koopia) saatmine töötajale * / w.postMessage (buff);
Pange tähele, et a SharedArrayBuffer
objekti tähistab ainult jagatud mälupiirkonda. Et binaarandmete vaatamine ja muutmine, peame kasutama sobivat andmestruktuuri (a Tippitud
või a DataView
objekt).
In index.html
ülaltoodud fail, uus SharedArrayBuffer
on loodud ainult ühe baidi pikkusega. Siis uus Int8Array
, mis on üks tüüp Tippitud
objektid on harjunud seadistage andmed “9” antud baitruumis.
onmessage = (e) => var arr = uus Int8Array (e.data); console.group ('[töötaja]'); console.log ('Peavõngast saadud andmed:% i', arr [0]); console.groupEnd ();
Int8Array
kasutatakse ka töötaja juures vaadake puhvris olevaid andmeid.
The eeldatav väärtus kuvatakse konsoolis töötaja lõngast, mida me just tahtsime:
[töötaja] Põhisõnast saadud andmed: 9
Nüüd, let's peamise niidi andmete värskendamine näha, kas muutus kajastub töötaja töös.
const w = new Worker ('worker.js'), buff = uus SharedArrayBuffer (1); var arr = uus Int8Array (buff); / * seadistusandmed * / arr [0] = 9; / * puhvri (koopia) saatmine töötajale * / w.postMessage (buff); / * andmete muutmine * / arr [0] = 1;
Ja nagu allpool näete, värskendus peegeldab töötaja sees!
[töötaja] Põhisõnast saadud andmed: 1
Aga ka kood peab töötama vastupidi: kui töötaja väärtus alguses muutub, siis samuti tuleb ajakohastada kui see on trükitud peamisest niidist.
Sellisel juhul näeb meie kood välja järgmiselt:
onmessage = (e) => var arr = uus Int8Array (e.data); console.group ('[töötaja]'); console.log ('Peavõngast saadud andmed:% i', arr [0]); console.groupEnd (); / * andmete muutmine * / arr [0] = 7; / * postitamist peakeermele * / postMessage (");
The andmeid muudetakse töötaja juures ja tühi sõnum postitatakse peateele tähistab, et puhvris olevad andmed on muutunud ja on valmis peamise niidi väljastamiseks.
const w = new Worker ('worker.js'), buff = uus SharedArrayBuffer (1); var arr = uus Int8Array (buff); / * seadistusandmed * / arr [0] = 9; / * puhvri (koopia) saatmine töötajale * / w.postMessage (buff); / * andmete muutmine * / arr [0] = 1; / * andmete printimine pärast seda, kui töötaja on selle muutnud * / w.onmessage = (e) => console.group ('[main]'); console.log ('Värskendatud andmed, mis on saadud töötaja niidist:% i', arr [0]); console.groupEnd ();
Ja see toimib ka! Puhvris olevad andmed on samad kui töötaja sees olevad andmed.
[töötaja] Peakeermest saadud andmed: 1 [peamine] Tööandjalt saadud värskendatud andmed: 7
Väärtus mõlemal juhul ilmub uuendatud; nii põhi- kui ka töötajate niidid vaatavad ja muudavad samu andmeid.
Lõplikud sõnad
Nagu ma juba varem mainisin, kasutasin JavaScriptis jagatud mälu ei ole ilma varjukülgedeta. Arendajate ülesanne on tagada, et täitmise järjestus toimub nagu ennustatud ja kaks lõnga ei ole võistlevad, et saada samu andmeid, sest keegi ei tea, kes võtab trofee.
Kui olete rohkem huvitatud ühisest mälust, siis vaadake programmi dokumentatsiooni Aatomit
objekti. The Aatomite objekt võib aidata teil mõningaid raskusi, vähendades ühismälust lugemise / kirjutamise ettearvamatut laadi.