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

How Does Async Work?

How Does Async Work?

If you work with Node.js or Python you might have heard of asynchronous programming a.k.a. async/await.
It lets you do something else while you wait on some work to be done in the background - like reading a file or sending some data over the network.
But what is it, really? And are there differences between the programming languages?
Let's go on a trip through async-land and discover callbacks, event loops, and state machines.
We will look at Node's, Python's, and Rust's async features and how they work under the hood.

Matthias Endler

September 24, 2019
Tweet

More Decks by Matthias Endler

Other Decks in Technology

Transcript

  1. How does

    Async 

    work?
    1

    View Slide

  2. ~ Matthias Endler ~
    2

    View Slide

  3. ~ Matthias Endler ~
    Backend engineer at trivago
    2

    View Slide

  4. ~ Matthias Endler ~
    Backend engineer at trivago
    Mostly Go, Rust, Python
    2

    View Slide

  5. ~ Matthias Endler ~
    Backend engineer at trivago
    Mostly Go, Rust, Python
    Interested in low level stuff
    2

    View Slide

  6. ~ Matthias Endler ~
    Backend engineer at trivago
    Mostly Go, Rust, Python
    Interested in low level stuff
    endler.dev and Hello-rust.show
    2

    View Slide

  7. 3

    View Slide

  8. 3

    View Slide

  9. 4
    move

    View Slide

  10. 4
    move

    View Slide

  11. 4
    move

    View Slide

  12. 4
    move

    View Slide

  13. ~ Python ~
    5

    View Slide

  14. 6

    View Slide

  15. 7

    View Slide

  16. 7

    View Slide

  17. 8

    View Slide

  18. 9

    View Slide

  19. 10

    View Slide

  20. 10

    View Slide

  21. Python's asyncio
    * coroutines
    * tasks
    * event loop
    * select
    11

    View Slide

  22. 12

    View Slide

  23. 13

    View Slide

  24. 13
    coroutine

    View Slide

  25. 14
    coroutine
    asyncio.gather( )

    View Slide

  26. 14
    coroutine
    Task

    View Slide

  27. 15
    asyncio.run( )

    View Slide

  28. 15
    Task

    View Slide

  29. 16

    View Slide

  30. 16

    View Slide

  31. 17

    View Slide

  32. 18
    select
    kernel
    userspace

    View Slide

  33. 18
    select
    kernel
    userspace

    View Slide

  34. 18
    select
    kernel
    userspace

    View Slide

  35. 18
    select
    kernel
    userspace

    View Slide

  36. 18
    select
    kernel
    userspace

    View Slide

  37. 18
    select
    kernel
    userspace

    View Slide

  38. 18
    select
    kernel
    userspace

    View Slide

  39. 18
    select
    kernel
    userspace

    View Slide

  40. 19

    View Slide

  41. 20

    View Slide

  42. 21

    View Slide

  43. 21

    View Slide

  44. ~ JavaScript ~
    22

    View Slide

  45. Async JavaScript
    * Callbacks
    * Promises
    * async/await
    23

    View Slide

  46. JavaScript Callbacks
    * The problem
    * The solution
    24

    View Slide

  47. 25

    View Slide

  48. 25

    View Slide

  49. 26

    View Slide

  50. 26
    v8

    View Slide

  51. 26
    v8 Spidermonkey

    View Slide

  52. 26
    v8 Spidermonkey Chakra core

    View Slide

  53. 27
    Heap Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop

    View Slide

  54. 28
    Heap Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop

    View Slide

  55. 28
    Heap Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop

    View Slide

  56. 29
    Heap Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop

    View Slide

  57. 29
    Heap Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop

    View Slide

  58. 30
    Heap Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop

    View Slide

  59. 30
    Heap Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop

    View Slide

  60. 31
    Heap Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop

    View Slide

  61. 31
    Heap Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop

    View Slide

  62. 32
    Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop

    View Slide

  63. 33
    Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop
    main

    View Slide

  64. 34
    Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop
    main
    console.log

    View Slide

  65. 35
    Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop
    One
    main

    View Slide

  66. 36
    Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop
    One
    main
    SetTimeout

    View Slide

  67. 37
    Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop
    main cb
    One

    View Slide

  68. 37
    Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop
    main cb
    One

    View Slide

  69. 38
    Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop
    One
    main cb
    console.log

    View Slide

  70. 39
    Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop
    One
    three
    cb

    View Slide

  71. 40
    Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop
    One
    three
    cb

    View Slide

  72. 40
    Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop
    One
    three
    cb

    View Slide

  73. 41
    Stack
    Web apis
    setTimeout
    dom
    ajax
    callback queue
    Event

    loop
    One
    three
    two

    View Slide

  74. 42
    v8 Spidermonkey Chakra core

    View Slide

  75. 42
    v8 Spidermonkey Chakra core
    Node.js

    View Slide

  76. 43

    View Slide

  77. 44
    Everything You Need to Know About Node.js Event Loop

    View Slide

  78. 45

    View Slide

  79. 46

    View Slide

  80. 47

    View Slide

  81. ~ Rust ~
    48

    View Slide

  82. What is Rust?
    Empowering everyoneto build

    reliable and efficient software.
    49

    View Slide

  83. What is Rust?
    * Systems programming language
    * Started at Mozilla (firefox)
    * used by Amazon/Microsoft/Dropbox...
    * Main goals: safety, performance
    * fearless concurrency
    50

    View Slide

  84. 51

    View Slide

  85. 52
    Future

    View Slide

  86. 53

    View Slide

  87. 54

    View Slide

  88. 55

    View Slide

  89. 56
    start open
    print
    error

    View Slide

  90. requests/s
    57
    2.000.000
    1.500.000
    1.000.000
    500.000
    0
    Rust

    (minihttp)
    java

    (rapidoid)
    go

    (fasthttp)
    go

    (stdlib)
    node.js

    (stdlib)

    View Slide

  91. 58

    View Slide

  92. Futures in Rust
    59
    mio
    tokio
    futures
    async/await
    select/epoll/kqueue
    Operating system
    external crates
    standard library

    View Slide

  93. Summary
    * asyncio in Python is based on coroutines
    * async in javascript is based on
    callbacks
    * Rust's futures are zero-cost
    60

    View Slide

  94. Credits
    * Pixel backgrounds by slance.com
    * Truck and engine logos by Pixelart maker
    * Jake Archibald - in the loop
    61

    View Slide