Sie sind auf Seite 1von 11

POGLAVLJE 20

Asinhronizam: pojmovi sada i kasnije

Jedan od najvanijih, ali uprkos tome esto slabo shvaenih delova programskog jezika
kao to je JavaScript jeste kako izraziti ponaanje programa koje je promenljivo tokom
vremena.
To se ne svodi samo na pitanje ta se dogaa od poetka petlje for do kraja petlje for,
kojoj je, razume se, potrebno izvesno vreme (vie mikrosekundi ili milisekundi) da bi se
izvrila. To je pitanje ta se dogaa kada se deo programa izvrava sada, a neki njegov
drugi deo se izvrava kasnije tokom perioda izmeu sada i kasnije, kada program za-
pravo nije aktivan.
Praktino svaki netrivijalan program koji je dosad napisan (naroito na JS-u) morao
je da na jedan ili drugi nain upravlja tim intervalom, bez obzira na to da li eka dok ko-
risnik unosi ulazne podatke, ili eka podatke iz baze podataka ili sistema datoteka, alje
podatke kroz mreu i eka odziv iz nje, ili obavlja posao koji se ponavlja u jednakim vre-
menskim intervalima (kao to je animacija). U svim tim razliitim sluajevima, program
mora da upravlja svojim stanjem kroz periode neaktivnosti. Kao to kae poznata pre-
poruka iz londonskog metroa (u vezi s rastojanjem izmeu vrata vagona i ivice perona):
vodite rauna o razmaku.
U stvari, taj odnos izmeu sada i kasnije delova programa ini sr asinhronog
programiranja.
Nesporno je da mogunost asinhronog programiranja postoji jo od samih poetaka
JavaScripta. Ipak, veina JS programera nije nikad zaista paljivo razmatrala kako i gde
se ono pojavljuje u njihovim programima, niti istraivala razne druge naine da ga pri-
meni. Dovoljno dobro reenje uvek je bila skromna povratna funkcija. Mnogi i danas tvr-
de da su povratne funkcije vie nego dovoljne.
Ali kako JS nastavlja da raste i iri se i po obimu i po sloenosti kako bi zadovoljio
neprekidno rastue zahteve za prvoklasnim jezikom koji radi i u itaima veba, i na ser-
verima i na svakom zamislivom ureaju izmeu njih, napori koje ulaemo da bismo
upravljali asinhronizmom softvera postaju sve tei i zahtevaju nalaenje reenja koja su
istovremeno i razumnija i pruaju vie mogunosti.
Mada vam sve ovo moda zasad izgleda prilino apstraktno, znajte da emo se time
baviti detaljnije i konkretnije u celom ovom delu knjige. U narednih nekoliko poglav-
lja prouiemo vie novih tehnika koje tek poinju da se primenjuju za asinhrono Java
Script programiranje.

407
Pre nego to preemo na to, moramo znatno detaljnije razmotriti ta je asinhroni rad
i kako se on postie u JavaScriptu.

Program u delovima
Ceo svoj JS program moete napisati u jednoj .js datoteci, ali je on gotovo uvek sastavljen
od vie delova, od kojih e se samo jedan izvriti sada, dok e se preostali delovi izvriti
kasnije. Najuobiajenija jedinica za svaki deli programa jeste funkcija (function).
Problem koji veina JS programera naizgled ima jeste to to se kasnije ne dogaa ne-
posredno i odmah nakon sada. Drugim reima, poslovi koji se ne mogu zavriti sada za-
vrie se po definiciji asinhrono, pa zato nee imati blokirajue ponaanje kao to bi-
ste intuitivno oekivali ili eleli.
Razmotrite sledee:
// ajax(..) je neka funkcija iz biblioteke
var data = ajax( http://some.url.1 );

console.log( data );
// Uh! `data` najee nee sadrati Ajax rezultate
Verovatno znate da se standardni Ajax zahtevi ne izvravaju sinhrono, to znai da
funkcija ajax(..) jo nema nikakvu vrednost da vrati kako bismo je dodelili promenlji-
voj data. Kada bi funkcija ajax(..) mogla da blokira izvravanje programa dok ne stigne
odziv, onda bi se operacija dodeljivanja data = .. izvrila kako treba.
Meutim, Ajax ne radi tako. Asinhroni Ajax zahtev aljemo sada, ali emo njegove re-
zultate dobiti kasnije.
Najjednostavniji (ali svakako ne i jedini, niti obavezno najbolji!) nain da saekamo
od sada do kasnije jeste da upotrebimo funkciju, poznatu pod nazivom povratna funkci-
ja (engl. callback function):
// ajax(..) je neka funkcija iz biblioteke
ajax( http://some.url.1, function myCallbackFunction(data){

console.log( data ); // Ura, sad imamo neto u `data`!

} );

Moda ste uli da je mogue slati sinhrone Ajax zahteve. Mada je to tehniki
izvodljivo, nemojte to nikad i ni u kom sluaju raditi, zato to tako blokirate ko-
risniki interfejs itaa veba (dugmad, menije, pomeranje sadraja prozora itd.)
i spreavate svaku interakciju s korisnikom. To je uasno loa ideja i trebalo bi
da je uvek izbegavate.

Pre nego to ponete da negodujete jer se ne slaete s time, rei emo da vaa elja da
izbegnete zbrku s povratnim funkcijama ne opravdava upotrebu blokirajueg, sinhro-
nog Ajaxa.

408|Poglavlje 20 Asinhronizam: pojmovi sada i kasnije


Na primer, razmotrite sledei kd:
function now() {
return 21;
}

function later() {
answer = answer * 2;
console.log( Smisao ivota je:, answer );
}

var answer = now();

setTimeout( later, 1000 ); // Smisao ivota je: 42


Ovaj program se sastoji od dva dela: dela koji se izvrava sada i dela koji e se izvriti
kasnije. Trebalo bi da bude prilino jasno koji su to delovi, ali biemo sasvim eksplicitni:
Sada:
function now() {
return 21;
}

function later() { .. }

var answer = now();

setTimeout( later, 1000 );


Kasnije:
answer = answer * 2;
console.log( Smisao ivota je:, answer );
Deo programa sada izvrava se odmah, im pokrenete izvravanje programa. Ali poto
funkcija setTimeout(..) definie dogaaj (isticanje vremenskog intervala) koji e se odi-
grati kasnije, sadraj funkcije later() izvrie se u nekom buduem trenutku (1000 mi-
lisekundi od sada).
Kad god deo koda upakujete u funkciju i zadate da se ona izvri kao odziv na odreeni
dogaaj (isticanje vremenskog intervala, pritiskanje tastera mia, prijem Ajax odziva itd.),
tako formirate element koji se izvrava kasnije i time u program uvodite asinhronizam.

Asinhronizam konzole
Ne postoji specifikacija niti skup zahteva koji bi propisivali kako treba da rade metode
console.* zato to one zvanino nisu sastavni deo JavaScripta, nego ih u JS dodaje rad-
no okruenje (videti etvrti deo ove knjige Tipovi i gramatika).
Iz tog razloga, razliiti itai veba i JS okruenja rade kako njima odgovara, to pone-
kad dovodi do zbunjujueg ponaanja.

Program u delovima | 409


Konkretno, postoje itai veba u kojima pod odreenim uslovima funkcija con-
sole.log(..) ne prikazuje odmah ono to joj prosledite. Glavni razlog zbog kojeg se to
moe dogoditi jeste to to su ulazno/izlazne operacije veoma spore i blokiraju delove
mnogih programa (ne samo sm JS). Zato ita veba moe pruiti bolje performanse
(ulazno/izlaznih operacija na veb stranici) ako funkcija console U/I zahteve obrauje
asinhrono u pozadini, a da vi moda niste ni svesni da se to dogaa.
Ne mnogo uobiajen, ali mogu sluaj gde bi to moglo da bude vidljivo (ne iz samog
koda, nego od spolja):
var a = {
index: 1
};

// kasnije
console.log( a ); // ??

// jo kasnije
a.index++;
Standardno bismo oekivali da vidimo kako se stanje objekta a prikazuje onakvo ka-
kvo je bilo tano u trenutku izvravanja iskaza console.log(..), tj. da se ispie neto po-
put { index: 1 }, tako da kad se izvri sledei iskaz a.index++ on menja stanje kakvo
je bilo neposredno nakon prikazivanja stanja a.
Prethodni primer koda predstavljae objekat na vaoj konzoli najee ba onako
kako biste oekivali. Ali, moe se dogoditi da isti kd radi u situaciji gde ita veba sma-
tra da ulazno/izlazne operacije na konzoli treba da izvrava u pozadini, kada se moe do-
goditi da je u trenutku kad se objekat prikazuje na konzoli itaa veba iskaz a.index++
ve bio izvren, pa zato konzola prikazuje { index: 2 }.
Teko je tano odrediti pod kojim e uslovima U/I operacije na konzoli biti odloene,
pa ak i to da li e to biti uoljivo. Imajte samo u vidu taj mogui U/I asinhronizam u slu-
aju da pri otkrivanju greaka imate problema s objektima koji se u programu menjaju
nakon izvravanja iskaza console.log(..), ali se uprkos tome na konzoli vide neoekiva-
ne naknadne izmene.

Ako vam se dogodi takav redak sluaj, najbolje reenje je da u svom JS dibage-
ru zadate prekidne take umesto da podatke prikazujete pomou iskaza con-
sole. Drugo najbolje reenje je da napravite snimak datog objekta tako to
ga serijalizujete u promenljivu tipa string na primer, pomou metode JSON.
stringify(..).

Petlja za obradu dogaaja


Jedna (moda okantna) tvrdnja: uprkos tome to oigledno omoguava pisanje asinhro-
nog JS koda (kao to je primer obrade dogaaja isticanja vremenskog intervala koji smo
upravo opisali), sve donedavno (ES6), u sam JavaScript nije bilo ugraeno zapravo nita
to bi direktno omoguavalo asinhronizam koda.

410|Poglavlje 20 Asinhronizam: pojmovi sada i kasnije


Molim!? To izgleda kao besmislena tvrdnja, zar ne? U stvari, prilino je tana. Sama
maina jezika JS nije nikad radila nita drugo osim to je u svakom datom trenutku izvr-
avala po jedan deli vaeg programa, kad god se to od nje zahtevalo.
Od nje zahtevalo. Ko je zahtevao? To je onaj najvaniji deo!
JS maina ne radi u izolaciji, nego unutar svog radnog okruenja, koje je za veinu pro-
gramera tipian ita veba. Pomou softvera kao to je Node.js, poslednjih nekoliko go-
dina (ali ni u kom sluaju samo tokom tog vremena), upotreba JavaScripta proirila se i
izvan itaa veba, na druga okruenja kao to su serveri. U stvari, danas se JavaScript
ugrauje u sve mogue vrste ureaja od robota do sijalica.
Zajednika nit (ovo je ne ba matovita asinhrona igra rei) svih tih okruenja je-
ste to da u sebi imaju mehanizam koji upravlja izvravanjem programa tokom vremena i
koji u svakom trenutku poziva JS mainu. Taj mehanizam se zove petlja za obradu doga-
aja (engl. event loop).
Drugim reima, JS maina nema uroen oseaj za vreme, ve slui kao okruenje za
izvravanje na (spoljni) zahtev proizvoljno zadatog dela JS koda. Spoljno okruenje JS
maine oduvek je odreivalo vremenski raspored dogaaja (izvravanja delova JS koda).
Tako, na primer, kada va JS program poalje Ajax zahtev za uitavanje odreenih po-
dataka sa servera, kd koji tumai odgovor servera zadajte unutar zasebne funkcije (ije
je uobiajeno ime povratna funkcija /engl. callback/), a JS maina kae radnom okrue-
nju: Sada u privremeno prekinuti rad, ali im zavri obradu ovog zahteva koji sam po-
slala u mreu i primi neke podatke, molim te pozovi ovu povratnu funkciju.
ita veba onda oslukuje i eka odziv iz mree, a kada dobije neto za vas, stavlja na
raspored za izvravanje povratnu funkciju tako to je umee u petlju za obradu dogaaja.
Dakle, ta je petlja za obradu dogaaja?
Prvo emo je konceptualizovati pomou malo pseudokoda:
// `eventLoop` je niz koji igra ulogu reda ekanja
// (obrada po modelu `prvi doao, prvi usluen`, FIFO)
var eventLoop = [ ];
var event;

// petlja se izvrava veno


while (true) {
// obrada jednog podeljka
if (eventLoop.length > 0) {
// uitati sledei dogaaj iz reda ekanja
event = eventLoop.shift();

// izvriti sledei dogaaj


try {
event();
}
catch (err) {
reportError(err);
}
}
}

Petlja za obradu dogaaja | 411


Ovo je, razume se, veoma pojednostavljen pseudokod, koji ilustruje koncepte. Ali tre-
balo bi da bude dovoljan za bolje razumevanje sutine.
Kao to vidite, imamo petlju koja se neprekidno izvrava i koju smo predstavili u obli-
ku petlje while, a svaka iteracija te petlje zove se podeljak (engl. tick). U svakom podeljku,
ako postoji dogaaj koji eka u redu, on se preuzima odatle i izvrava. Ti dogaaji su po-
vratne funkcije.
Vano je imati na umu da setTimeout(..) ne postavlja vau povratnu funkciju u red
ekanja petlje za obradu dogaaja. Metoda setTimeout(..) pokree odbrojavanje vre-
menskog intervala; kada taj interval istekne, radno okruenje postavlja vau povratnu
funkciju u petlju za obradu dogaaja, da bi je neki budui podeljak pokupio i izvrio.
ta ako u tom trenutku u petlji dogaaja ve ima 20 stavki na ekanju? Onda vaa po-
vratna funkcija eka. Ona staje u red i eka iza svih ostalih standardno ne postoji nain
za zaobilaenje i preskakanje mesta u redu prema napred. To objanjava zato intervali
ekanja koje definiete pomou metode setTimeout(..) nisu uvek tane duine. Garan-
tovano je (grubo reeno) da se vaa povratna funkcija nee pokrenuti pre kraja intervala
ekanja koji zadate, ali se to moe dogoditi tano u tom trenutku ili posle njega, zavisno
od stanja petlje za obradu dogaaja.
Drugim reima, va program je najee izdeljen na vie malih delova, koji se izvrava-
ju jedan za drugim u petlji za obradu dogaaja. Tehniki govorei, u istom redu ekanja za
izvravanje mogu biti isprepleteni i dogaaji koji nisu u direktnoj vezi s vaim programom.

Uz tvrdnju da ES6 menja prirodu mesta na kome se upravlja redom ekanja u


petlji za obradu dogaaja, upotrebili smo izraz donedavno. To je najveim
delom formalna tehnika napomena, ali poto ES6 sada tano propisuje kako
radi petlja za obradu dogaaja, to znai da je, tehniki gledano, to u nadleno-
sti JS maine, a ne radnog okruenja JavaScripta. Jedan od najvanijih razloga
za tu promenu bilo je uvoenje ES6 obeanja, koja emo razmotriti u poglavlju 22, zato to
ona zahtevaju direktnu i preciznu kontrolu nad operacijama rasporeivanja u redu ekanja
petlje dogaaja (videti opis metode setTimeout(..0) u odeljku Saradnja na strani 423).

Paralelni vienitni rad


Vrlo je uobiajeno da ljudi brkaju znaenje rei asinhrono i paralelno ali one znae
zapravo sasvim razliite stvari. Ne zaboravite, asinhrono se odnosi na interval izmeu
sada i kasnije, a paralelno opisuje stvari koje se mogu odvijati istovremeno.
Najuobiajenije alatke za paralelan rad koda jesu procesi i niti izvravanja (engl. thre-
ads). Procesi i niti izvravaju se nezavisno jedni od drugih i mogu se izvravati istovreme-
no: na zasebnim procesorima, pa ak i na zasebnim raunarima, ali vie niti moe deli-
ti memoriju istog procesa.
Nasuprot tome, petlja za obradu dogaaja deli svoje zadatke na poslove koje izvrava
serijski (jedan za drugim), to spreava upotrebu paralelnih procesa i menjanje sadraja
deljene memorije. Paralelizam i serijalizam mogu postojati istovremeno u obliku petlji
za obradu dogaaja koje meusobno sarauju ali rade u zasebnim nitima.

412|Poglavlje 20 Asinhronizam: pojmovi sada i kasnije


Do preplitanja paralelnih niti izvravanja i preplitanja asinhronih dogaaja moe doi
na vrlo razliitim nivoima granularnosti.
Na primer:
function later() {
answer = answer * 2;
console.log( Smisao ivota je:, answer );
}
Ceo sadraj funkcije later() bio bi jedna stavka u redu ekanja petlje za obradu do-
gaaja, ali ako razmatramo nit u kojoj bi se ovaj kd izvravao, imali bismo zapravo dese-
tak operacija niskog nivoa. Na primer, answer = answer * 2 zahteva da se prvo uita teku-
a vrednost promenjive answer, zatim da se negde smesti vrednost 2, emu sledi operacija
mnoenja, a onda se rezultat te operacije smeta u answer.
U jednonitnom okruenju, nije ba bitno da li su stavke u redu ekanja niti operaci-
je niskog nivoa, zato to nita ne moe da prekine izvravanje niti. Ali ako imate parale-
lan sistem, gde dve razliite niti rade za isti program, vrlo je mogue nepredvidljivo po-
naanje.
Razmotrite sledee:
var a = 20;

function foo() {
a = a + 1;
}

function bar() {
a = a * 2;
}

// ajax(..) je neka funkcija iz biblioteke


ajax( http://some.url.1, foo );
ajax( http://some.url.2, bar );
U jednonitnom ponaanju JavaScripta, ako se funkcija foo() izvri pre funkcije bar(),
rezultat je to da a ima vrednost 42, ali ukoliko se funkcija bar() izvri pre funkcije foo(),
rezultat u a bie 41.
Meutim, ako se JS dogaaji koji dele iste podatke izvravaju paralelno, problemi bi
bili znatno suptilniji. Razmotrite sledee dve liste poslova (izraene pomou pseudoko-
da) kao niti koje izvravaju kd funkcije foo(), odnosno bar() i pogledajte ta se dogaa
kada se obe niti izvravaju tano u isto vreme:
Nit 1 (X i Y su privremene lokacije u memoriji):
foo():
a. uitati vrednost `a` u `X`
b. upisati `1` u `Y`
c. sabrati `X` i `Y`, upisati rezultat u `X`
d. vrednost `X` upisati u `a`

Paralelni vienitni rad | 413


Nit 2 (X i Y su privremene lokacije u memoriji):
bar():
a. uitati vrednost `a` u `X`
b. upisati `2` u `Y`
c. pomnoiti `X` sa `Y`, upisati rezultat u `X`
d. vrednost `X` upisati u `a`
A sada, recimo da se obe niti izvravaju potpuno paralelno. Verovatno ve moete da
uoite problem, zar ne? Obe niti koriste za svoje privremene korake iste deljene memo-
rijske lokacije X i Y.
Koji je konaan rezultat u a ako se koraci izvre sledeim redosledom?
1a (uitati vrednost `a` u `X` ==> `20`)
2a (uitati vrednost `a` u `X` ==> `20`)
1b (upisati `1` u `Y` ==> `1`)
2b (upisati `2` u `Y` ==> `2`)
1c (sabrati `X` i `Y`, upisati rezultat u `X` ==> `22`)
1d (vrednost `X` upisati u `a` ==> `22`)
2c (pomnoiti `X` sa `Y`, upisati rezultat u `X` ==> `44`)
2d (vrednost `X` upisati u `a` ==> `44`)
Rezultat u a bie 44. Ali ta ako je redosled sledei?
1a (uitati vrednost `a` u `X` ==> `20`)
2a (uitati vrednost `a` u `X` ==> `20`)
2b (upisati `2` u `Y` ==> `2`)
1b (upisati `1` u `Y` ==> `1`)
2c (pomnoiti `X` sa `Y`, upisati rezultat u `X` ==> `20`)
1c (sabrati `X` i `Y`, upisati rezultat u `X` ==> `21`)
1d (vrednost `X` upisati u `a` ==> `21`)
2d (vrednost `X` upisati u `a` ==> `21`)
Rezultat u a bie 21.
Dakle, programiranje niti moe biti vrlo zapetljano, zato to ako ne preduzmete poseb-
ne mere da spreite dogaanje te vrste prekidanja/preplitanja, moete dobiti veoma izne-
naujue i nedeterministiko ponaanje koje esto dovodi do glavobolja.
JavaScript nikada ne deli podatke izmeu niti, to znai da taj nivo nedeterminizma
ne pravi problem. Ali to ne znai da je JS uvek deterministiki. Ve smo videli da razli-
it redosled izvravanja funkcija foo() i bar() proizvodi dva razliita rezultata (41 ili 42).

Moda jo nije oigledno, ali nije svaki nedeterminizam lo. Nedeterminizam je


ponekad nebitan, a ponekad je nameran. Vie primera toga videemo u ovom i
u sledeih nekoliko poglavlja.

414|Poglavlje 20 Asinhronizam: pojmovi sada i kasnije


Potpuno izvravanje
Zbog jednonitne prirode JavaScripta, kd unutar funkcije foo() (i bar()) ini jednu jedi-
nicu, to znai sledee: im funkcija foo() pone da se izvrava, ceo njen kd e se izvr-
iti pre nego to pone izvravanje koda funkcije bar(), i obrnuto. To ponaanje se zove
potpuno izvravanje (engl. run-to-completion).
U stvari, semantika potpunog izvravanja postaje jasnija kada funkcije foo() i bar()
sadre vie koda, na primer:
var a = 1;
var b = 2;

function foo() {
a++;
b = b * a;
a = b + 3;
}

function bar() {
b--;
a = 8 + b;
b = a * 2;
}

// ajax(..) je neka Ajax funkcija iz biblioteke


ajax( http://some.url.1, foo );
ajax( http://some.url.2, bar );
Poto funkcija bar() ne moe prekinuti izvravanje funkcije foo(), niti obrnuto, ovaj
program moe dati samo dva mogua rezultata, u zavisnosti od toga koja funkcija prva
pone da se izvrava kada bi bio mogu vienitni rad i kad bi bilo dozvoljeno da se pre-
plie izvravanje pojedinanih iskaza funkcija foo() i bar(), broj moguih rezultata pro-
grama znaajno bi se poveao!
Deo 1 programa je sinhron (dogaa se sada), ali su delovi 2 i 3 asinhroni (dogaaju se
kasnije), to znai da e izmeu njihovog izvravanja protei odreeno vreme.
Deo 1:
var a = 1;
var b = 2;
Deo 2 (foo()):
a++;
b = b * a;
a = b + 3;
Deo 3 (bar()):
b--;
a = 8 + b;
b = a * 2;

Paralelni vienitni rad | 415


Poto se od delova 2 i 3 svaki moe izvriti pre onog drugog, ovaj program moe ima-
ti dva mogua rezultata, kao to je ovde ilustrovano:
Rezultat 1:
var a = 1;
var b = 2;

// foo()
a++;
b = b * a;
a = b + 3;

// bar()
b--;
a = 8 + b;
b = a * 2;

a; // 11
b; // 22
Rezultat 2:
var a = 1;
var b = 2;

// bar()
b--;
a = 8 + b;
b = a * 2;

// foo()
a++;
b = b * a;
a = b + 3;

a; // 183
b; // 180
Dva mogua rezultata istog koda znae da i dalje imamo nedeterminizam! Ali to je na
nivou redosleda izvravanja funkcija (dogaaja), a ne na nivou redosleda izvravanja iskaza
programa (ili, u stvari, na nivou redosleda operacija nad izrazima) kao u sluaju niti. Dru-
gim reima, determinizam programa je bolji nego u sluaju vienitnog izvravanja.
Primenjeno na ponaanje JavaScripta, za taj nedeterminizam usled redosleda izvra-
vanja funkcija postoji uobiajen izraz stanje utrkivanja (engl. race condition) jer se funk-
cije foo() i bar() meusobno trkaju koja e se prva izvriti. Konkretno, imamo trku zato
to nema pouzdanog naina da predvidimo koju e vrednost dobiti a i b.

416|Poglavlje 20 Asinhronizam: pojmovi sada i kasnije


Kada bi u JavaScriptu postojala funkcija ije ponaanje nije potpuno izvrava-
nje, mogli bismo imati mnogo vie moguih rezultata, zar ne? Ispostavlja se da
ES6 uvodi jednu ba takvu stvar (videti poglavlje 23), ali zasad ne brinite i to
emo razmotriti!

Istovremenost
Zamislite veb lokaciju koja prikazuje listu auriranih statusa (kao to je lista vesti na
drutvenim mreama) koja se puni dok korisnik pomera sadraj prozora. Da bi to radilo
kako treba, potrebno je da se (barem) dva zasebna procesa izvravaju istovremeno (na
primer, tokom istog vremenskog intervala, ali ne obavezno i u istom trenutku).

Re proces ovde piemo izmeu navodnika zato to to nisu pravi procesi ope-
rativnog sistema kako ih raunarska nauka definie. To su virtuelni procesi, ili
poslovi, koje ine logiki povezani sekvencijalni nizovi operacija. Re proces
koristimo umesto posao zato to ona terminoloki odgovara definiciji konce-
pata koje ovde razmatramo.

Prvi proces e se odazivati na dogaaje onscroll (tako to e slati Ajax zahteve za


nov sadraj) kako oni nastaju dok korisnik pomera sadraj veb stranice nadole. Drugi
proces e primati Ajax odgovore (radi prikazivanja novog sadraja na stranici).
Oigledno, ako korisnik pomera sadraj stranice dovoljno brzo, moda ete videti dva
ili vie dogaaja onscroll unutar jednog vremenskog intervala koji je potreban da stigne
prvi odgovor i da se on obradi, pa ete zato imati brzo odigravanje dogaaja onscroll i
dogaaja Ajax, isprepletene jedne s drugim.
Istovremenost (engl. concurrency) imamo kada se dva ili vie procesa izvravaju isto-
vremeno tokom istog perioda, bez obzira na to da li se operacije koje ih ine odvijaju pa-
ralelno (u istom trenutku na zasebnim procesorma ili jezgrima). Istovremenost moete
zamisliti kao paralelizam na nivou procesa (ili poslova), nasuprot paralelizmu na nivou
operacija (niti koje rade na zasebnim procesorima).

Istovremenost uvodi i opcioni pojam meusobne interakcije tih procesa, na


koji emo se vratiti u nastavku teksta.

Tokom datog vremenskog intervala (nekoliko sekundi tokom kojih korisnik pomera
sadraj prozora), pokuaemo da vizuelizujemo svaki nezavisan proces kao niz doga-
aja/operacija:
Proces 1 (dogaaji onscroll):
onscroll, request 1
onscroll, request 2
onscroll, request 3
onscroll, request 4

Istovremenost|417

Das könnte Ihnen auch gefallen

  • 17 JS
    17 JS
    Dokument10 Seiten
    17 JS
    zaba
    Noch keine Bewertungen
  • 27 JS
    27 JS
    Dokument8 Seiten
    27 JS
    zaba
    Noch keine Bewertungen
  • 01 JS
    01 JS
    Dokument11 Seiten
    01 JS
    zaba
    Noch keine Bewertungen
  • 04 JS
    04 JS
    Dokument10 Seiten
    04 JS
    zaba
    Noch keine Bewertungen
  • 2014 Zadaća 1
    2014 Zadaća 1
    Dokument10 Seiten
    2014 Zadaća 1
    zaba
    Noch keine Bewertungen
  • Dodatak
    Dodatak
    Dokument4 Seiten
    Dodatak
    zaba
    Noch keine Bewertungen
  • 10 JS
    10 JS
    Dokument11 Seiten
    10 JS
    zaba
    Noch keine Bewertungen
  • Zadaca 3
    Zadaca 3
    Dokument1 Seite
    Zadaca 3
    zaba
    Noch keine Bewertungen