Slide 1

Slide 1 text

Implementing Async MPMC Channel in Rust Motoyuki Kimura 1

Slide 2

Slide 2 text

MPMC Channel? ● Multi Producer Multi Consumer Channel ● i.e. have multiple senders and multiple receivers 2 Sender Sender Sender Receiver Receiver

Slide 3

Slide 3 text

Channel Types ● Bounded / Unbounded ● Async / Sync ● SPSC, MPSC, MPMC 3

Slide 4

Slide 4 text

Prior Art 4 kind bounded / unbounded sync / async std::mpmc mpmc, mpsc, etc both sync crossbeam mpmc, mpsc, etc both sync async_channel mpmc both async kanal mpmc both sync/async Go channel mpmc both async

Slide 5

Slide 5 text

How do channels work? 5

Slide 6

Slide 6 text

● Allocate a fixed length area Bounded 6 Sender Receiver

Slide 7

Slide 7 text

Bounded 7 AAA BBB CCC Sender Receiver sender.send(CCC)

Slide 8

Slide 8 text

Bounded 8 BBB CCC Sender AAA Receiver

Slide 9

Slide 9 text

Bounded 9 HHH DDD EEE FFF GGG Sender CCC Receiver

Slide 10

Slide 10 text

Bounded 10 Sender Receiver ● If there is no available data, reader would block Block!

Slide 11

Slide 11 text

Bounded 11 HHH III CCC DDD EEE FFF GGG Sender Receiver ● If receiver is too slow, sender would block Block!

Slide 12

Slide 12 text

Bounded 12 HHH DDD EEE FFF GGG Sender Sender Sender Receiver Receiver ● Actually, multiple senders and receivers work concurrently

Slide 13

Slide 13 text

Implementation Details 13

Slide 14

Slide 14 text

How to achieve block/unblock? 14

Slide 15

Slide 15 text

Block / Unblock 15 ● Sync channel ○ thread api (park, unpark) ● Async channel ○ waker api

Slide 16

Slide 16 text

Block / Unblock 16 Sender Receiver Block!

Slide 17

Slide 17 text

Block / Unblock 17 Sender Receiver Waker Waker list ● When block happens, store waker somewhere

Slide 18

Slide 18 text

Block / Unblock 18 CCC Sender Receiver Waker1 Waker list ● When block happens, store waker somewhere Pop from list

Slide 19

Slide 19 text

Depth of Wakerlist … 🚀 19 ● For wakerlist, intrusive linked list would be much performant ○ What are intrusive linked lists? ○ new internal semaphore based on intrusive lists

Slide 20

Slide 20 text

How to test concurrent code base? 20

Slide 21

Slide 21 text

How to test concurrent code base? 21 ● Multi threaded ● Complex synchronization ● Atomic Operations

Slide 22

Slide 22 text

How to test concurrent code base? 22

Slide 23

Slide 23 text

How to test concurrent code base? 23 Detect Deadlocks! 🙌

Slide 24

Slide 24 text

About Loom internals … 24 Video 🎥: https://youtu.be/-MRCgyiCxWU?si=a4NNwSxVgke6AFwZ Slide 📝: https://speakerdeck.com/kimuramotoyuki/bug-free-concurrency-in-rust

Slide 25

Slide 25 text

25 https://crates.io/crates/chunnel

Slide 26

Slide 26 text

Thank you! 26