Futures, Actors, and Streams

Futures, Actors, and Streams

Concepts and Technologies for Distributed Systems and Big Data Processing Futures, Actors, and Streams Philipp Haller KTH Royal Institute of Technology Sweden TU Darmstadt, Germany, 24 May 2016 Programming a Concurrent World • How to compose programs handling • asynchronous events? • streams of asynchronous events? • distributed events? ➟ Programming abstractions for concurrency! Philipp Haller 2 Overview • Futures, promises • Async/await • Actors Philipp Haller 3 Why a Growable Language for Concurrency? Philipp Haller 4 Why a Growable Language for Concurrency? • Concurrency not a solved problem ➟ development of new programming models Philipp Haller 4 Why a Growable Language for Concurrency? • Concurrency not a solved problem ➟ development of new programming models • Futures, promises Philipp Haller 4 Why a Growable Language for Concurrency? • Concurrency not a solved problem ➟ development of new programming models • Futures, promises • async/await Philipp Haller 4 Why a Growable Language for Concurrency? • Concurrency not a solved problem ➟ development of new programming models • Futures, promises • async/await • STM Philipp Haller 4 Why a Growable Language for Concurrency? • Concurrency not a solved problem ➟ development of new programming models • Futures, promises • async/await • STM • Agents Philipp Haller 4 Why a Growable Language for Concurrency? • Concurrency not a solved problem ➟ development of new programming models • Futures, promises • async/await • STM • Agents • Actors Philipp Haller 4 Why a Growable Language for Concurrency? • Concurrency not a solved problem ➟ development of new programming models • Futures, promises • Join-calculus • async/await • STM • Agents • Actors Philipp Haller 4 Why a Growable Language for Concurrency? • Concurrency not a solved problem ➟ development of new programming models • Futures, promises • Join-calculus • async/await • Reactive streams • STM • Agents • Actors Philipp Haller 4 Why a Growable Language for Concurrency? • Concurrency not a solved problem ➟ development of new programming models • Futures, promises • Join-calculus • async/await • Reactive streams • STM • CSP • Agents • Actors Philipp Haller 4 Why a Growable Language for Concurrency? • Concurrency not a solved problem ➟ development of new programming models • Futures, promises • Join-calculus • async/await • Reactive streams • STM • CSP • Agents • Async CML • Actors Philipp Haller 4 Why a Growable Language for Concurrency? • Concurrency not a solved problem ➟ development of new programming models • Futures, promises • Join-calculus • async/await • Reactive streams • STM • CSP • Agents • Async CML • Actors • … Philipp Haller 4 Why a Growable Language for Concurrency? • Concurrency not a solved problem ➟ development of new programming models • Futures, promises • Join-calculus • async/await • Reactive streams • STM • CSP • Agents • Async CML • Actors Which •one… is going to “win”? Philipp Haller 4 Background Philipp Haller 5 Background • Authored or co-authored: • Scala Actors (2006) • Scala futures and promises (2011/2012) • Scala Async (2013) Philipp Haller 5 Background • Authored or co-authored: • Scala Actors (2006) • Scala futures and promises (2011/2012) • Scala Async (2013) • Contributed to Akka (Typesafe/Lightbend) Philipp Haller 5 Background • Authored or co-authored: • Scala Actors (2006) • Scala futures and promises (2011/2012) • Scala Async (2013) • Contributed to Akka (Typesafe/Lightbend) • Akka.js project (2014) Philipp Haller 5 Background • Authored or co-authored: Other proposals and research projects: • Scala Actors (2006) • Scala Joins (2008) • Scala futures and promises (2011/2012) • FlowPools (2012) • Scala Async (2013) • Spores (safer closures) • Contributed to Akka (Typesafe/Lightbend) • • Akka.js project (2014) Capabilities and uniqueness • … Philipp Haller 5 Scala Primer Philipp Haller 6 Scala Primer • Local variables: val x = fun(arg) // type inference Philipp Haller 6 Scala Primer • Local variables: val x = fun(arg) // type inference • Functions: Philipp Haller 6 Scala Primer • Local variables: val x = fun(arg) // type inference • Functions: • { param => fun(param) } Philipp Haller 6 Scala Primer • Local variables: val x = fun(arg) // type inference • Functions: • { param => fun(param) } • (param: T) => fun(param) Philipp Haller 6 Scala Primer • Local variables: val x = fun(arg) // type inference • Functions: • { param => fun(param) } • (param: T) => fun(param) • Function type: T => S or (T, S) => U Philipp Haller 6 Scala Primer • Local variables: val x = fun(arg) // type inference • Functions: • { param => fun(param) } • (param: T) => fun(param) • Function type: T => S or (T, S) => U • Methods: def meth(x: T, y: S): R = { .. } Philipp Haller 6 Scala Primer • Local variables: val x = fun(arg) // type inference • Functions: • { param => fun(param) } • (param: T) => fun(param) • Function type: T => S or (T, S) => U • Methods: def meth(x: T, y: S): R = { .. } • Classes: class C extends D { .. } Philipp Haller 6 Scala Primer (2) Philipp Haller 7 Scala Primer (2) • Generics: Philipp Haller 7 Scala Primer (2) • Generics: • class C[T] { var fld: T = _ ; .. } Philipp Haller 7 Scala Primer (2) • Generics: • class C[T] { var fld: T = _ ; .. } • def convert[T](obj: T): Result = .. Philipp Haller 7 Scala Primer (2) • Generics: • class C[T] { var fld: T = _ ; .. } • def convert[T](obj: T): Result = .. • Pattern matching: Philipp Haller 7 Scala Primer (2) • Generics: • class C[T] { var fld: T = _ ; .. } • def convert[T](obj: T): Result = .. • Pattern matching: • case class Person(name: String, age: Int) Philipp Haller 7 Scala Primer (2) • Generics: • class C[T] { var fld: T = _ ; .. } • def convert[T](obj: T): Result = .. • Pattern matching: • case class Person(name: String, age: Int) • val isAdult = p match { case Person(_, a) => a >= 18 case Alien(_, _) => false } Philipp Haller 7 Example • Common task: • Convert object to JSON • Send HTTP request containing JSON Philipp Haller 8 Example • Common task: • Convert object to JSON • Send HTTP request containing JSON import scala.util.parsing.json._ def convert[T](obj: T): Future[JSONType] def sendReq(json: JSONType): Future[JSONType] Philipp Haller 8 Example • Common task: • Convert object to JSON • Send HTTP request containing JSON import scala.util.parsing.json._ def convert[T](obj: T): Future[JSONType] def sendReq(json: JSONType): Future[JSONType] Philipp Haller 8 Example • Common task: • Convert object to JSON • Send HTTP request containing JSON import scala.util.parsing.json._ def convert[T](obj: T): Future[JSONType] def sendReq(json: JSONType): Future[JSONType] Ousterhout et al. Making sense of performance in data analytics frameworks. NSDI ’15 Philipp Haller 8 Callbacks • How to respond to asynchronous completion event? ➟ Register callback Philipp Haller 9 Callbacks • How to respond to asynchronous completion event? ➟ Register callback val person = Person(“Tim”, 25) val fut: Future[JSONType] = convert(person) fut.foreach { json => val resp: Future[JSONType] = sendReq(json) .. } Philipp Haller 9 Exceptions • Serialization to JSON may fail at runtime • Closure passed to foreach not executed in this case • How to handle asynchronous exceptions? Philipp Haller 10 Exceptions • Serialization to JSON may fail at runtime • Closure passed to foreach not executed in this case • How to handle asynchronous exceptions? val fut: Future[JSONType] = convert(person) fut.onComplete { case Success(json) => val resp: Future[JSONType] = sendReq(json) case Failure(e) => e.printStackTrace() } Philipp Haller 10 Partial Functions { case Success(json) => .. case Failure(e) => .. } Philipp Haller 11 Partial Functions { case Success(json) => .. case Failure(e) => .. } … creates an instance of PartialFunction[T, R]: Philipp Haller 11 Partial Functions { case Success(json) => .. case Failure(e) => .. } … creates an instance of PartialFunction[T, R]: val pf: PartialFunction[Try[JSONType], Any] = { case Success(json) => .. case Failure(e) => .. } Philipp Haller 11 Type of Partial Functions • Partial functions have a type PartialFunction[A, B] • PartialFunction[A, B] is a subtype of Function1[A, B] Philipp Haller 12 Type of Partial Functions • Partial functions have a type PartialFunction[A, B] • PartialFunction[A, B] is a subtype of Function1[A, B] abstract class Function1[A, B] { def apply(x: A): B .. } abstract class PartialFunction[A, B] extends Function1[A, B] { def isDefinedAt(x: A): Boolean def orElse[A1 <: A, B1 >: B] (that: PartialFunction[A1, B1]): PartialFunction[A1, B1] .. } Philipp Haller 12 Type of Partial Functions • Partial functions have a type PartialFunction[A, B] • PartialFunction[A, B] is a subtype of Function1[A, B] abstract class Function1[A, B] { Simplified! def apply(x: A): B .. } abstract class PartialFunction[A, B] extends Function1[A, B] { def isDefinedAt(x: A): Boolean def orElse[A1 <: A, B1 >: B] (that: PartialFunction[A1, B1]): PartialFunction[A1, B1] .. } Philipp Haller 12 Success and Failure package scala.util abstract class Try[+T] case class Success[+T](v: T) extends Try[T] case class Failure[+T](e: Throwable) extends Try[T] Philipp Haller 13 Nested Exceptions ➟ Exception handling tedious and not compositional: Philipp Haller 14 Nested Exceptions ➟ Exception handling tedious and not compositional: val fut: Future[JSONType] = convert(person) fut.onComplete { case Success(json) => val resp: Future[JSONType] = sendReq(json) resp.onComplete { case Success(jsonResp) => .. // happy path case Failure(e1) => e1.printStackTrace(); ??? } case Failure(e2)

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    153 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us