Slide 1

Слични документи
Slide 1

Inženjering informacionih sistema

PowerPoint Presentation

Dijagrami sekvenci

Classroom Expectations

12 Stanje

Microsoft PowerPoint - OOPpredavanja05 [Compatibility Mode]

Увод у организацију и архитектуру рачунара 1

Računarski praktikum I - Vježbe 09 - this, static

Računarske mreže Čas 2 Ivana Tanasijević Matematički fakultet, Beograd 1

Microsoft Word - MySQL_3.doc

ЖИРОКЛИРИНГ И БРУТО ПОРАВНАЊЕ У РЕАЛНОМ ВРЕМЕНУ (БПРВ) ОПИС РАДА СИСТЕМА На основу Закона о Централној банци БиХ у којем стоји: Основни задаци Централ

Postavka 12: Uzročnost 1 DISTRIBUIRANI ALGORITMI I SISTEMI Iz kursa CSCE 668 Proleće 2014 Autor izvorne prezentacije: Prof. Jennifer Welch

Microsoft PowerPoint - GR_MbIS_12_IDEF

Tutoring System for Distance Learning of Java Programming Language

P9.1 Dodela resursa, Bojenje grafa

Apache Maven Bojan Tomić

Microsoft Word - 11 Pokazivaci

Microsoft PowerPoint - Programski_Jezik_C_Organizacija_Izvrsnog_Programa [Compatibility Mode]

KDP

PowerPoint Presentation

Generated by Foxit PDF Creator Foxit Software For evaluation only. Operativni sistem U računarstvu, operativni sistem (OS

Postavka 2: Osnovni graf algoritmi 1 DISTRIBUIRANI ALGORITMI I SISTEMI Iz kursa CSCE 668 Proleće 2014 Autor izvorne prezentacije: Prof. Jennifer Welch

Algoritmi i arhitekture DSP I

PowerPoint Presentation

UPUTSTVO ZA KRETANJE KROZ EON KORISNIČKI INTERFEJS 1

Microsoft PowerPoint - Programski_Jezik_C_Organizacija_Izvornog_Programa_I_Greske [Compatibility Mode]

Modem i lokalna mreža Vodič za korisnika

Vjezbe

Projekti šabloni

Model podataka

Document ID / Revision : 0419/1.1 ID Issuer Sustav (sustav izdavatelja identifikacijskih oznaka) Upute za registraciju gospodarskih subjekata

Broj: 01-12/2014 Datum: Direktor preduzeća Phoneco doo, Marko Burgić dipl. Oecc., objavljuje OPŠTE USLOVE USTUPANJA PRAVA NA KORIŠĆENJE POS

PROMENLJIVE, TIPOVI PROMENLJIVIH

PowerPoint Presentation

VEŽBA 5: KLASE I OBJEKTI U C# Cilj ove vežbe je upoznavanje sa osnovama rada sa klasama i objektima u programskom jeziku C#. Pored toga, bide demonstr

KATALOG ZNANJA IZ INFORMATIKE

Препоруке безбедности мрежних сервиса Copyright 2015 АМРЕС

UPUTSTVO ZA PODEŠAVANJE EON MENIJA 1

Tutoring System for Distance Learning of Java Programming Language

R u z v e l t o v a 5 5, B e o g r a d, t e l : ( ) , m a i l : c o n t a c p s i t. r s, w w w. p s i t. r s

Opći uvjeti korištenja servisa e-Račun za državu povezivanjem_obveznici javne nabave_052019_konačna verzija

Microsoft PowerPoint - 03-Slozenost [Compatibility Mode]

NAPOMENA: Studenti na ispit donose kod urađenog zadatka

Microsoft PowerPoint - Topic02 - Serbian.ppt

Zbirka resenih zadataka iz arhitekture racunara

Primenjeno programiranje - vezbe GUI i baze podataka

Uputstvo za korišćenje Mastercard Identity Check usluge Uputstvo za korišćenje Mastercard Identity Check usluga sigurnijeg plaćanja na internetu

ELEKTROTEHNIČKI FAKULTET, UNIVERZITET U BEOGRADU KATEDRA ZA ELEKTRONIKU UVOD U ELEKTRONIKU - 13E041UE LABORATORIJSKA VEŽBA Primena mikrokontrolera

Број: /14 Датум: Београд На основу чл. 8. став 1. тачка 1) и 11. став 1. тачка 2) Закона о електронским комуникацијама ( Служб

Predmet: Marketing

Tutoring System for Distance Learning of Java Programming Language

Microsoft PowerPoint - vezbe 4. Merenja u telekomunikacionim mrežama

СТАРТ - СТОП ПАРКИНГ СИСТЕМ КОРИСНИЧКО УПУТСТВО страна 1 од 12

06 Poverljivost simetricnih algoritama1

D12_5 MNE_Dio 04 - Procjena EE Investicija F1

Projektovanje informacionih sistema i baze podataka

PowerPoint Presentation

Microsoft PowerPoint - 13-Funkcije_2.ppt [Compatibility Mode]

Microsoft PowerPoint - Topic02 - Serbian.ppt

Korisničko uputstvo mobilne aplikacije Digitalni Kiosk 1

Funkcije predavač: Nadežda Jakšić

P11.3 Analiza zivotnog veka, Graf smetnji

Sveučilište u Zagrebu

IEP - Projekat 2018/2019

PHP proširenja za rad sa bazama podataka Postoje pojedinačna proširenja za različite tipove baza podataka sa svojim bibliotekama funkcija npr. postoji

DIGITALNA OBRADA SLIKE

Uvod u Python

Za formiranje JOPPD obrasca neophodno je točno popuniti šifre u osnovama primitaka. Svaka osnova primitka ima propisane šifre u prilozima JOPPD

Microsoft PowerPoint - 07-DinamickeStrukturePodataka

ПА-4 Машинско учење-алгоритми машинског учења

POSLOVNI INFORMACIONI SISTEMI I RA^UNARSKE

PROGRAMIRANJE Program je niz naredbi razumljivih računalu koje rješavaju neki problem. Algoritam je postupak raščlanjivanja problema na jednostavnije

Slide 1

Funkcije predavač: Nadežda Jakšić

Повезивање са интернетом

PPT

Microsoft PowerPoint - PRI2014 KORIGOVANO [Compatibility Mode]

PowerPoint Template

Slide 1

PowerPoint Presentation

My_P_Trigo_Zbir_Free

Републичко такмичење

PowerPoint Presentation

Terminski_plan_rada

Programski jezici i strukture podataka 2018/2019. Programski jezici i strukture podataka Računarske vežbe vežba 10 Zimski semestar 2018/2019. Studijsk

Univerzitet u Novom Sadu Tehnički fakultet Mihajlo Pupin Zrenjanin Seminarski rad Predmet: Konkuretno programiranje doc. dr Dejan Lacmanovic Zorica Br

Школа Ј. Ј. Змај Свилајнац МЕСЕЧНИ ПЛАН РАДА ЗА СЕПТЕМБАР Школска 2018 /2019. Назив предмета: Информатика и рачунарство Разред: 5. Недељни број часова

Рачунарска интелигенција

EMS-ESS-UG-001-SRB-Ucesnik.doc

MV Merchandise visibility sistem

UVOD - OD JAVE DO C# ELEMENTARNE RAZLIKE Veliki broj Java/C# razlika su uglavnom preimenovane ključne reči i razlike u konvencijama imenovanja. Neke o

Microsoft PowerPoint - 06 Uvod u racunarske mreze.ppt

STRATEGIJSKI MENADŽMENT

Microsoft PowerPoint - jkoren10.ppt

Verovatnoća - kolokvijum 17. decembar Profesor daje dva tipa ispita,,,težak ispit i,,lak ispit. Verovatnoća da student dobije težak ispit je

Повезивање са интернетом

Prezentator: Nataša Dvoršak Umag, 20.listopad 2006

COMARC/A Format

PowerPoint Presentation

Транскрипт:

Funkcionalno programiranje Konkurentno programiranje i buduće vrednosti, 2019.

Uvod Konkurentno programiranje u jeziku Scala zasniva se na konceptu aktera koncept vodi poreklo iz jezika Erlang If Java is 'write once, run anywhere', then Erlang is 'write once, run forever. Joe Armstrong Generalna ideja: akteri su učesnici u komunikaciji razmenjuju poruke jedini način komunikacije: kroz razmenu poruka Akteri mogu da prime bilo kakvu poruku posao aktera je da analizira i evaluira prispelu poruku na osnovu toga odlučuje da li da je odbaci ili nešto uradi šta će uraditi zavisi od poruke, ali i unutrašnjeg stanja aktera Akter = onaj ko reaguje na prispeće poruke 2

Uvod Akteri su realizovani u vidu "lakih" niti JVM je ograničena na nekoliko hiljada niti Aktera može biti za nekoliko redova veličine više Veći potencijal za skalabilnost Do verzije 2.10, jezik Scala je u svojoj biblioteci podržavao aktere Od verzije 2.11 koristi se biblioteka AKKA palindrom od AK action kernel takođe ime boginje iz švedske mitologije "Actors in Scala" Philipp Haller, Frank Sommers, Aritma 2012 3

Primer upotrebe aktera Primer: aritmetički akter prima dva broja njegov posao je da ta dva broja sabere Takav akter nema mnogo smisla: gde se koristi proizvod njegovog rada? Trebalo bi da se rezultat prosledi drugom akteru (ili onom koji je poslao zahtev za sabiranje) 4

Primer upotrebe aktera Akter c se još naziva nastavljajući akter nastavlja lanac Programski stil kod kojeg se u poruci dostavlja i nastavljajući akter se zove continuation-passing (CPS) 5

Objedinjuje tok kontrole i tok podataka Prenosom podataka i nastavljajućeg aktera u jednoj poruci, model aktera objedinjuje tok kontrole tok podataka To omogućava jednostavniji dizajn programa zasnovanih na akterima Neke od prednosti: modularni dizajn sastavljanje lanca aktera u vreme izvršenja programa inkrementano dodavanje elemenata Akter koji primi poruku može stvoriti druge aktere koji bi obavili posao (fork / join) Veoma liči na način komunikacije objekata u OOP ali uzima u obzir asinhronost u komunikaciji 6

Doprinos aktera U konkurentnom programiranju, tok podataka i tok kontrole programa postaju teški za razumevanje sa porastom programa jedno rešenje: uvođenje serijalizacije u tok podataka čak i tada je podložno greškama Mana rešenja: smanjuje se konkurentnost izvršavanja deo programa se efektivno pretvara u sekvencijalni samo jedna nit može da pristupa deljenom (ili globalnom) stanju Doprinos: definiše kontrolne strukture tako da minimizuje zavisnost od globalnog stanja programa odluke o toku su kapsulirane u objektima, (uglavnom) lokalno stanje se koristi za odlučivanje princip lokalnosti 7

Model aktera Smatra se da je slanje asinhrona operacija Može proteći proizvoljno vremena od kada A1 uputi poruku ka A2, do trenutka kada A2 primi poruku kašnjenje u mreži zato što je A1 poslao poruku do A3, a A2 je nastavljajući akter A1 odmah nastavlja sa radom, nezavisno od dalje sudbine poruke eventualni odgovor takođe stiže asinhrono pretpostavka je da se poruke ne gube ali vreme stizanja odgovora nije ograničeno Postoji i podrška za sinhronu komunikaciju 8

Nedefinisan redosled prijema poruka Model aktera ne definiše mehanizam pouzdane isporuke poruka (ne bavi se tim problemom) Model podrazumeva da mnogo poruka može biti poslato u kratkom vremenskom intervalu poruke se ne smeju izgubiti Zbog toga model zahteva da postoji specijalan objekat koji prima i čuva poruke sve dok ih akter ne obradi poštansko sanduče (mailbox) Poruke se ne moraju čitati prema redosledu prispeća po uzoru na "pravo" poštansko sanduče redosled isporučivanja je suštinski nedefinisan Zbog toga ispravnost programa ne sme da zavisi od redosleda prispeća poruka 9

Crta Actor trait Actor extends AnyRef { type Receive = PartialFunction[Any, Unit] protected abstract def receive : Receive // Stores the context for this actor, including self, and sender. implicit val context : ActorContext def postrestart (reason: Throwable): Unit def poststop (): Unit def prerestart (reason: Throwable, message: Option[Any]): Unit def prestart (): Unit implicit val self : ActorRef def sender : ActorRef def supervisorstrategy (): SupervisorStrategy def unhandled (message: Any): Unit 10

Detalji crte Actor Jedna apstraktna metoda: receive ako akter ne ume da obradi prispelu poruku izuzetak Tip ActorRef nepromenljiv objekat omotač oko pravog aktera to je jedini način da se interaguje sa akterom serijalizabilan i "svestan" mreže može da se snimi (serijalizuje) može da se pošalje putem mreže i iskoristi na udaljenom računaru, jer se i dalje "zna" na kom računaru se akter nalazi self: referenca ka ActorRef objektu aktera sender: referenca ka akteru koji je poslao poruku supervisorstrategy: definicija strategije za nadgledanje aktera-potomaka 11

Detalji crte Actor context akteru izlaže informaciju o kontekstu i trenutnoj poruci ima proizvodni metod za stvaranje aktera-potomaka (actorof) sistem kojem akter pripada referenca ka roditelju supervizoru nadgledani akteri potomci praćenje životnog ciklusa 12

Pravljenje novog aktera Akteri se implementiraju umetanjem (nasleđivanjem) crte Actor i implementiranjem metode receive Metoda receive treba da obradi niz case iskaza koristi se standardno uparivanje obrazaca uparen obrazac definiše očekivano ponašanje niz vraća tip PartialFunction[Any, Unit] Treba da obradi sve moguće vrste poruka koristiti džoker znak ako to ne uradi, baca se izuzetak u slučaju prijema neočekivane poruke akka.actor.unhandledmessage(message, sender, recipient) 13

Pravljenje novog aktera - klasa Props - Konfiguraciona klasa služi za zadavanje opcija prilikom stvaranja aktera nepromenljiv objekat Može se stvoriti na nekoliko načina import akka.actor.props val props1 = Props[MyActor] // u redu val props2 = Props( new MyActor ) // opasno u dosegu drugog aktora, // može dovesti do utrkivanja 14

Pravljenje novog aktera Akteri se stvaraju prosleđivanjem Props objekta u actorof proizvodnu metodu koja je dostupna u objektima ActorSystem i ActorContext ActorSystem je "teški" objekat hijerarhijska grupa aktera upravlja izvršenjem i raspoređivanjem aktera preporučuje se stvaranje samo jedne instance po aplikaciji import akka.actor.actorsystem // stvaranje nezavisnog aktera ("top level") val system = ActorSystem("mySystem") val myactor = system.actorof(props[myactor], "myactor2") // stvaranje aktera-potomka class FirstActor extends Actor { val child = context.actorof(props[myactor], name = "mychild") //... 15

Primer import akka.actor.actor import akka.actor.actorsystem import akka.actor.props object Hello extends App { class HelloActor extends Actor { def receive = { case "hello" => println("hello back at you " + sender() ) case _ => println("no comprendo...") val system = ActorSystem("HelloSystem") // pravi aktore val helloactor = system.actorof(props[helloactor], name = "helloactor") helloactor! "hello" helloactor! "buenos dias" system.shutdown hello back at you Actor[akka://HelloSystem/deadLetters] no comprendo... 16

Primer Obratiti pažnju: slanje je asinhrono! helloactor! "hello" helloactor! "buenos dias" println("test") test hello back at you Actor[akka://HelloSystem/deadLetters] no comprendo... 17

Specifičnosti Poziv actorof vraća instancu tipa ActorRef Ime aktera je opciono, ali se preporučuje imenovanje ime ne sme biti prazno ili da počinje sa $ u slučaju dupliranog imena u okviru istog roditelja baca izuzetak Akteri se ne zaustavljaju automatski (na primer, kada se više ne referenciraju) moraju biti eksplicitno uništeni Zaustavljanje roditeljskog aktera automatski zaustavlja sve aktere potomke 18

become / unbecome ActorContext klasa ima metode become i unbecome Namena: promeniti ponašanje aktera Staro ponašanje se pamti na namenskom steku abstract def become(behavior: Receive, discardold: Boolean): Unit behavior postaje novi receive: PartialFunction[Any, Unit] discardold=true zameni element na vrhu steka (default) discardold=false push new abstract def unbecome(): Unit skida sa steka tekuće ponašanje novo ponašanje je ono na vrhu steka 19

Nadgledanje životnog ciklusa aktera Kada je potrebna notifikacija o permanentnom prestanku rada drugog aktera (za razliku od restartovanja) zainteresovan akter se prijavi za prijem poruke Terminated funkcionalnost obezbeđuje DeathWatch komponenta iz sistema aktera import akka.actor.{ Actor, Props, Terminated class WatchActor extends Actor { val child = context.actorof(props.empty, "child") context.watch(child) // dovoljno za registraciju var lastsender = context.system.deadletters def receive = { case "kill" => context.stop(child); lastsender = sender() case Terminated(`child`) => lastsender! "finished" 20

Nadgledanje životnog ciklusa aktera Poruka Terminated se generiše nezavisno od redosleda u kojem se događaju registracija i terminacija posmatrajući akter će dobiti poruku čak i kada je akter već završen u trenutku registracije Višestruka registracija ne implicira i višestruke Terminated poruke ali ne postoji garancija da će samo jedna Terminated poruka biti primljena Deregistracija: context.unwatch(actor) funkcioniše čak i kada je Terminated poruka prethodno stigla u poštansko sanduče posle poziva, više neće biti obrađivane Terminated poruke za toga aktera 21

Nadgledanje životnog ciklusa aktera Odmah po startovanju aktera, poziva se prestart metoda poziva se kada se akter po prvi put stvara poziva se iz podrazumevane implementacije postrestart metode nadjačavanjem te metode može da se kontroliše da li se metoda prestart poziva samo jednom ili pri svakom restartu Akteri mogu biti restartovani ako se baci izuzetak tokom obrade poruka staroj inkarnaciji aktera se poziva prerestart sa kontekstom koji je doveo do izuzetka novoj inkarnaciji aktera se poziva postrestart sa izuzetkom koji je izazvao restart (default: poziva se prestart) sadržaj poštanskog sandučeta se ne menja restartom, pa se obrada poruka nastavlja (bez poruke koja je izazvala restart) 22

Nadgledanje životnog ciklusa aktora Akteri se zaustavljaju metodom stop iz klase ActorContext: zaustavljanje aktera ili njegove dece iz klase ActorSystem: za aktere najvišeg nivoa Zaustavljanje je asinhrono Po zaustavljanju aktera, poziva se njegova poststop metoda može da se koristi za odjavljivanje aktera od nekih servisa Poziv se garantovano obavlja nakon sprečavanja daljeg dodavanja poruka u sanduče eventualne poruke prosleđuju se deadletters akteru 23

Životni ciklus aktera 24

Nadgledanje životnog ciklusa aktora Zaustavljanje se obavlja u 2 koraka 1 Suspenduje poštansko sanduče Šalje stop svoj deci 2 Obrađuje notifikacije o zaustavljanju od dece Zaustavlja sebe šalje poststop uništava poštansko sanduče objavljuje Terminated na DeathWatch, čime obaveštava supervizora Nakon toga, sistem poziva poststop metodu 25

Primer zaustavljanja class MyActor extends Actor { val child: ActorRef =... def receive = { case "interrupt-child" => context stop child case "done" => context stop self 26

Primer kontrolisanog zaustavljanja object Manager { case object Shutdown class Manager extends Actor { import Manager._ val worker = context.watch(context.actorof(props[cruncher], "worker")) def receive = { case "job" => worker! "crunch" case Shutdown => worker! PoisonPill context become shuttingdown def shuttingdown: Receive = { case "job" => sender()! "service unavailable, shutting down" case Terminated(worker) => context stop self 27

Akteri i izuzeci Ako se izuzetak baci dok se poruka prosleđuje akteru poruka se gubi (ne vraća se u sanduče) programer mora da uhvati izuzetak i ponovi obradu, ako je poruka bitna voditi računa nekako ograničiti broj ponavljanja (inače livelock) sadržaj sandučeta ostaje nepromenjen, čak i kada se restartuje akter Ako izuzetak baci kod u samom akteru akter se suspenduje i nadgledajući proces se pokreće akter može biti nastavljen, restartovan ili okončan 28

Proširivanje aktera parcijalnim funkcijama Ponašanje aktera se može zadati kompozicijom više funkcija Ovo je moguće zato što receive metoda vraća Actor.Receive, što je alijas tipa za PartialFunction[Any,Unit] Parcijalna funkcija je funkcija koja je definisana samo za neke vrednosti ulaznih parametara selekcija case je zapravo jedna parcijalna funkcija Primer: val one: PartialFunction[Int, String] = { case 1 => "jedan" val two: PartialFunction[Int, String] = { case 2 => "dva" val wildcard: PartialFunction[Int, String] = { case _ => "drugo" val partial = one orelse two orelse wildcard partial(5) // drugo partial(2) // dva 29

Proširivanje aktera parcijalnim funkcijama Primer: akter koji je istovremeno i proizvođač i potrošač trait ProducerBehavior { this: Actor => val producerbehavior: Receive = { case GiveMeThings => sender()! Give("thing") trait ConsumerBehavior { this: Actor with ActorLogging => val consumerbehavior: Receive = { case ref: ActorRef => ref! GiveMeThings case Give(thing) => println("dobio sam: " + thing) 30

Proširivanje aktora parcijalnim funkcijama class Producer extends Actor with ProducerBehavior { def receive = producerbehavior class Consumer extends Actor with ActorLogging with ConsumerBehavior { def receive = consumerbehavior class ProducerConsumer extends Actor with ActorLogging with ProducerBehavior with ConsumerBehavior { def receive = producerbehavior.orelse[any, Unit](consumerBehavior) // protocol case object GiveMeThings final case class Give(thing: Any) 31

Vremenska kontrola izvršavanja http://doc.akka.io/docs/akka/2.5.1/scala/howto.html#scheduling_periodic_messages ActorSystem ima mogućnost raspoređivanja događaja (slanja poruka) Može da se kontroliše slanje poruka datom aktoru izvršavanje zadataka (funkcija ili Runnable objekata) Nije namenjen dugoročnom planiranju događaja (trenutna implementacija < 8 meseci) Nije namenjen preciznom okidanju događaja pravi bakete poslova baketi se prazne prema fiksnom rasporedu na tikove pokreće sve čemu je isteklo predviđeno vreme 32

Primer import akka.actor._ import scala.concurrent.duration._ import scala.concurrent.executioncontext.implicits.global object Clock extends App { case class Poruka() case class Gotovo() class Ispisivac extends Actor { def receive = { case Poruka() => println("protekla 1 sekunda") case Gotovo() => context stop self val system = ActorSystem("system") val actor = system.actorof(props( new Ispisivac ), name = "ispis") system.scheduler.schedule(0 seconds, 1 seconds, actor, Poruka()) system.scheduler.scheduleonce(5 seconds, actor, Gotovo()) 33

Buduće vrednosti Futures (poglavlje 32) Alternativni mehanizam za ostvarivanje konkurentnosti Predstavlja očekivani rezultat neke funkcije koja u trenutku stvaranja objekta još uvek nije završila (ili čak nije počela izvršavanje) U jeziku Scala je moguće primeniti transformacije nad budućim vrednostima koje još uvek nisu izračunate nije neophodno blokiranje dok se čeka vrednost (za razliku od Jave) povećava konkurentnost Rezultat transformacije buduće vrednosti je buduća vrednost predstavlja asinhroni rezultat izvorne buduće vrednosti transformisane funkcijom 34

Buduće vrednosti Futures Nit koja zapravo vrši računanje buduće vrednosti određuje se implicitno dostavljenim izvršnim kontekstom (execution context) Glavna prednost: programer opisuje asinhrona računanja kao niz transformacija nad nepromenljivim vrednostima ne mora da se razmišlja o deljenoj memoriji ne mora da se razmišlja o sinhronizaciji Zbog kompatibilnosti sa Javom, Scala podržava metode modela monitora: wait, notify i notifyall predefinisanu metodu synchronized (ne postoji direktiva) var brojac = 0 synchronized { // Samo jedna nit u datom trenutku brojac = brojac + 1 35

Kontekst izvršenja Buduća vrednost predstavlja obradu (računanje) koja će asinhrono biti izvršena (možda druga nit) Zateva poseban kontekst za svoje izvršenje kontekst se implicitno usvaja potrebno je da bude eksplicitno uvezen import scala.concurrent.future import scala.concurrent.executioncontext.implicits.global object Futures extends App { val fut = Future { Thread.sleep(10000); 21 + 21 // Future.apply // fut: scala.concurrent.future[int] = Future(<not completed>) println(fut.iscompleted) // false println(fut.value) // None // tip je: Option[scala.util.Try[Int]]... println(fut.value) // Some(Success(42)) 36

Try / Success / Failure scala.util Try[+T] Success[T] Failure[T] Vrednost buduće vrednosti je: uspeh (sadrži vrednost tipa T - rezultat) neuspeh (sadrži izuzetak tipa java.lang.throwable) Ovakav pristup omogućava da se obrađuju buduće vrednosti čije izračunavanje dovodi do bacanja izuzetka "Asinhroni try-catch" 37

Transformacije nad budućim vrednostima Načelno: umesto da se obrada blokira dok buduća vrednost ne bude spremna, pravi se nova buduća vrednost Primer: scala> val fut = Future { Thread.sleep(10000); 21 + 21 fut: scala.concurrent.future[int] =... scala> val result = fut.map(x => x + 1) result: scala.concurrent.future[int] =... scala> result.value res5: Option[scala.util.Try[Int]] = None... scala> result.value res6: Option[scala.util.Try[Int]] = Some(Success(43)) 38