Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Asynchronous Programming: Scala.concurrent and Monix! What?

Asynchronous Programming: Scala.concurrent and Monix! What?

In the context of executing a task, a synchronous execution indicates that the program waits for the result of the first task before moving on to another task. In contrast, an asynchronous execution does not wait for the result of the first task and it starts executing another task immediately after the first task has begun. Both Futures & Promises, and Monix are Scala libraries that allow users to efficiently perform asynchronous operations.

This talk introduces the Futures & Promises library in Scala.concurrent and Monix. We will walk through several examples that demonstrate how to use Futures & Promises, and Monix. In addition, the talk compares and contrasts the similarities and differences between the two libraries. Furthermore, we will discuss some best practices in debugging asynchronous systems.

Resources on Pg. 41:
Iulian Dragos - Async Debugger in Scala IDE:
http://iulidragos.com/assets/papers/stack-retention.pdf
http://scala-ide.org/docs/current-user-doc/features/async-debugger/index.html
https://github.com/jamie-allen/async_debugger_demo
https://www.youtube.com/watch?v=P32Drw0CX08
IntelliJ Capture (2017):
https://blog.jetbrains.com/idea/2017/02/intellij-idea-2017-1-eap-extends-debugger-with-async-stacktraces/
https://blog.jetbrains.com/idea/2017/02/intellij-idea-2017-1-eap-extends-debugger-with-async-stacktraces/#comment-403133
https://www.jetbrains.com/help/idea/async-stacktraces.html

A078f516b18456207d62f4b84ab0e919?s=128

Yifan Xing

April 18, 2018
Tweet

Transcript

  1. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA YIFAN XING -

    2018 ASYNCHRONOUS PROGRAMMING Yifan Xing SCALA.CONCURRENT AND MONIX! @yifan_xing_e
  2. 01 Synchronous vs. Asynchronous Differences Futures & Promises Debugging Async

    Programs Monix A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA 02 03 04 05 Overview ASYNCHRONOUS PROGRAMMING: SCALA.CONCURRENT AND MONIX! 1
  3. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Concurrency Synchronous Asynchronous

    Single-threaded Multi-threaded YIFAN XING - 2018 @yifan_xing_e 2
  4. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Synchronous: Single-threaded YIFAN

    XING - 2018 Task 1 Task 2 Task 3 @yifan_xing_e 3
  5. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Synchronous: Multi-threaded YIFAN

    XING - 2018 Task 1 Task 2 Task 3 @yifan_xing_e 4
  6. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Asynchronous: Single-threaded YIFAN

    XING - 2018 Task 1 Task 2 Task 3 @yifan_xing_e 5
  7. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Asynchronous: Multi-threaded YIFAN

    XING - 2018 Task 1 Task 2 Task 3 @yifan_xing_e 6
  8. Future Promise ExecutionContext Examples Scala.concurrent

  9. YIFAN XING - 2018 Scala.concurrent: Future Computation Incomplete: Computation Completed:

    Future is not completed Future is completed: with a Value => Success Future is completed: with an Exception => Failure An object holding a value which may become available at some point Immutable A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e Future 7
  10. YIFAN XING - 2018 Example: Callbacks Multiple callbacks may be

    registered; NO guarantee that they will be executed in a particular order. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 8
  11. YIFAN XING - 2018 Example: Callbacks Multiple callbacks may be

    registered; NO guarantee that they will be executed in a particular order. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 8
  12. YIFAN XING - 2018 Example: Callbacks Multiple callbacks may be

    registered; NO guarantee that they will be executed in a particular order. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 8
  13. YIFAN XING - 2018 Example: Callbacks Multiple callbacks may be

    registered; NO guarantee that they will be executed in a particular order. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 8
  14. YIFAN XING - 2018 Example: Callbacks Chain callbacks Allow one

    to enforce callbacks to be executed in a specified order. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 9
  15. YIFAN XING - 2018 Example: Callbacks Chain callbacks Allow one

    to enforce callbacks to be executed in a specified order. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 9
  16. YIFAN XING - 2018 Example: Callbacks A TOUR OF ASYNCHRONOUS

    PROGRAMMING IN SCALA @yifan_xing_e Exception in callback: NOT propagated to the subsequent andThen callbacks. 10
  17. YIFAN XING - 2018 Example: Transformations A TOUR OF ASYNCHRONOUS

    PROGRAMMING IN SCALA @yifan_xing_e 11
  18. YIFAN XING - 2018 Example: Transformations A TOUR OF ASYNCHRONOUS

    PROGRAMMING IN SCALA @yifan_xing_e 11
  19. YIFAN XING - 2018 Example: Transformations A TOUR OF ASYNCHRONOUS

    PROGRAMMING IN SCALA @yifan_xing_e 12
  20. YIFAN XING - 2018 Example: Transformations A TOUR OF ASYNCHRONOUS

    PROGRAMMING IN SCALA @yifan_xing_e 13
  21. YIFAN XING - 2018 Example: Transformations More generic & flexible

    A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 14
  22. YIFAN XING - 2018 Example: Transformations More generic & flexible

    A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 14
  23. YIFAN XING - 2018 Example: Transformations More generic & flexible

    A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 14
  24. YIFAN XING - 2018 Example: Transformations More generic & flexible

    A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 14
  25. YIFAN XING - 2018 Example: Transformations More generic & flexible

    A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 14
  26. YIFAN XING - 2018 Example: Transformations If no match cases

    or original future contains a valid result: New future will contain the same result as the original one. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e Evaluated only after a Failure 15
  27. YIFAN XING - 2018 Example: Transformations If no match cases

    or original future contains a valid result: New future will contain the same result as the original one. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e Evaluated only after a Failure 15
  28. YIFAN XING - 2018 Example: Transformations If no match cases

    or original future contains a valid result: New future will contain the same result as the original one. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e Evaluated only after a Failure 15
  29. YIFAN XING - 2018 Example: Transformations If no match cases

    or original future contains a valid result: New future will contain the same result as the original one. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e Evaluated only after a Failure 15
  30. YIFAN XING - 2018 Example: Transformations If both futures failed,

    the resulting future holds the throwable object of the first future. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 16
  31. YIFAN XING - 2018 Example: Transformations If both futures failed,

    the resulting future holds the throwable object of the first future. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 16
  32. YIFAN XING - 2018 Example: Transformations A TOUR OF ASYNCHRONOUS

    PROGRAMMING IN SCALA @yifan_xing_e 16 If both futures failed, the resulting future holds the throwable object of the first future.
  33. YIFAN XING - 2018 Scala.concurrent: Promises A writable, single-assignment container

    Can create a Future Can complete a Future, only ONCE A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e Promise: 17
  34. YIFAN XING - 2018 Example: Promises A Promise can be

    completed at most ONCE. If the promise has already been fulfilled, failed or has timed out, calling this method will throw an IllegalStateException. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 18
  35. YIFAN XING - 2018 Example: Promises A Promise can be

    completed at most ONCE. If the promise has already been fulfilled, failed or has timed out, calling this method will throw an IllegalStateException. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 18
  36. YIFAN XING - 2018 Example: Promises A Promise can be

    completed at most ONCE. If the promise has already been fulfilled, failed or has timed out, calling this method will throw an IllegalStateException. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 18
  37. YIFAN XING - 2018 Example: Promises If the promise has

    already been completed returns false, or true otherwise. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 19
  38. YIFAN XING - 2018 Example: Promises If the promise has

    already been completed returns false, or true otherwise. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 19
  39. YIFAN XING - 2018 Example: Promises If the promise has

    already been completed returns false, or true otherwise. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA @yifan_xing_e 19
  40. YIFAN XING - 2018 A TOUR OF ASYNCHRONOUS PROGRAMMING IN

    SCALA Building A Client-facing Interface @yifan_xing_e 20
  41. YIFAN XING - 2018 A TOUR OF ASYNCHRONOUS PROGRAMMING IN

    SCALA p.future Problem in A Client-facing Interface @yifan_xing_e 21
  42. YIFAN XING - 2018 Monix @yifan_xing_e

  43. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA What is Monix?

    Asynchronous, event-based programs Data type: Task, etc. "Factory" of Future instances Lazy & asynchronous computations YIFAN XING - 2018 @yifan_xing_e 22
  44. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Monix: Task YIFAN

    XING - 2018 Lazily evaluated Evaluated when call runAsync Trigger side effects @yifan_xing_e 23
  45. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Monix: Task YIFAN

    XING - 2018 Lazily evaluated Evaluated when call runAsync Trigger side effects @yifan_xing_e 23
  46. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Monix: Task YIFAN

    XING - 2018 Lazily evaluated Evaluated when call runAsync Trigger side effects @yifan_xing_e 23
  47. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Monix: Task Callback

    YIFAN XING - 2018 Eagerly evaluate task Register callbacks Similar to Future#onComplete @yifan_xing_e 24
  48. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Monix: Task Callback

    YIFAN XING - 2018 Eagerly evaluate task Register callbacks Similar to Future#onComplete @yifan_xing_e 24
  49. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Monix: Task Callback

    YIFAN XING - 2018 Eagerly evaluate task Register callbacks Similar to Future#onComplete @yifan_xing_e 24
  50. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Monix: Eager/ Lazy

    YIFAN XING - 2018 Evaluate eagerly Equivalent to Future#successful Defer eager evaluation Similar to Task#eval @yifan_xing_e 25
  51. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Monix: Eager/ Lazy

    YIFAN XING - 2018 Evaluate eagerly Equivalent to Future#successful Defer eager evaluation Similar to Task#eval @yifan_xing_e 25
  52. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Monix: Memoization YIFAN

    XING - 2018 Evaluated lazily Not memoized, recompute each time the Task is executed. Evaluate lazily Evaluated exactly ONCE Result is memoized @yifan_xing_e 26
  53. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Monix: Memoization YIFAN

    XING - 2018 Evaluated lazily Not memoized, recompute each time the Task is executed. Evaluate lazily Evaluated exactly ONCE Result is memoized @yifan_xing_e 26
  54. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Monix: MemoizeOnSuccess YIFAN

    XING - 2018 Exceptions are not cached. Only cache the first successful result @yifan_xing_e 27
  55. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Monix: MemoizeOnSuccess YIFAN

    XING - 2018 Exceptions are not cached. Only cache the first successful result @yifan_xing_e 27
  56. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Monix: MemoizeOnSuccess YIFAN

    XING - 2018 Exceptions are not cached. Only cache the first successful result @yifan_xing_e 27
  57. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Monix: Alternative Thread

    Pool YIFAN XING - 2018 Overrides default scheduler Overriding the "default" scheduler can only happen ONCE Task is immutable @yifan_xing_e 28
  58. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Monix: Alternative Thread

    Pool YIFAN XING - 2018 Overrides default scheduler Overriding the "default" scheduler can only happen ONCE Task is immutable @yifan_xing_e 28
  59. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Monix: Alternative Thread

    Pool YIFAN XING - 2018 Overrides default scheduler Overriding the "default" scheduler can only happen ONCE Task is immutable @yifan_xing_e 28
  60. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Monix: CancelableFuture YIFAN

    XING - 2018 Calling it multiple times has the same side- effect as calling it only once. @yifan_xing_e 29
  61. - A value - Executed when constructed - Eager evaluation

    - ExecutionContext needed whenever use operators A function - Execution controllable by user - Lazy evaluation - ExecutionScheduler needed whenever - use runAsync Monix Future Eager/Lazy A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA 30
  62. - Memoized by default - Evaluated once - Store result

    Explicitly use memoization operators - Evaluated whenever needed - Referential transparency - Monix Future Memoization A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA 31
  63. - Sometimes errors are not propagated - Override reportFailure in

    provided ExecutionContext to control output of unpropagated exceptions Scheduler.reportFailure - Defaults to System.err - Allow customized logging tools - Monix Future ErrorHandling A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA 32
  64. Future Monix A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA 33

  65. Future Monix A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA 34

  66. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Debugging BEST PRACTICES

    In Asynchronous Programs @yifan_xing_e
  67. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA 35

  68. Writing Async Code 1. Rethink before adding more code 2.

    Adding more code to fix problems will usually add more bugs D e b u g 1. Test code in isolation 2. Observe what is happening 3. Confirm behavior before moving on T e s t 36
  69. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Using Await &

    Print YIFAN XING - 2018 @yifan_xing_e TimeoutException if after waiting for the specified time awaitable is still not ready atMost may be: A finite positive duration Negative (no waiting is done) Duration.Inf for unbounded waiting 37
  70. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Using Await &

    Print YIFAN XING - 2018 @yifan_xing_e TimeoutException if after waiting for the specified time awaitable is still not ready atMost may be: A finite positive duration Negative (no waiting is done) Duration.Inf for unbounded waiting 37
  71. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA ScalaTest: ScalaFutures YIFAN

    XING - 2018 @yifan_xing_e Default timeout 150ms TestFailedException if not finished after timeout 38
  72. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA ScalaTest: ScalaFutures YIFAN

    XING - 2018 @yifan_xing_e Default timeout 150ms TestFailedException if not finished after timeout 38
  73. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA ScalaTest: ScalaFutures YIFAN

    XING - 2018 @yifan_xing_e Default timeout 150ms TestFailedException if not finished after timeout 38
  74. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Resources: Async Debugger

    & Capture YIFAN XING - 2018 @yifan_xing_e IntelliJ Capture (2017): Iulian Dragos - Async Debugger in Scala IDE IntelliJ IDEA 2017.1 EAP Extends Debugger with Async Stacktraces Developer's Explanation Debugging Tutorial Async Stacktraces Stack Retention Scala IDE Doc Demo: Jamie Allen Rethink the Debugger: Scala Days 2014 39
  75. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA Using Async Debugger

    / Capture YIFAN XING - 2018 @yifan_xing_e Substituting its parts related to the asynchronous code execution with where it was called Sender: Async code executor Receiver: executed code Config exact signatures of methods of the async code Stores the stack and variables info in a map (1000 stacks), where the key is a parameter with the specified number. 40
  76. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA YIFAN XING -

    2018 @yifan_xing_e ( Sorry Alex :P ) 41
  77. A TOUR OF ASYNCHRONOUS PROGRAMMING IN SCALA YIFAN XING -

    2018 @yifan_xing_e 42
  78. T H A N K Y O U @yifan_xing_e