Slide 1

Slide 1 text

非同期処理の歴史から見たコンピューティングの進化 マーベリック株式会社 リチャード 伊真岡

Slide 2

Slide 2 text

現代のアプリケーション開発は 非同期処理が重要

Slide 3

Slide 3 text

モバイルアプリケーションでの 同時多発的な処理

Slide 4

Slide 4 text

処理がまずいと...

Slide 5

Slide 5 text

サーバー側でも様々な処理を 同時に行う

Slide 6

Slide 6 text

JavaScript: promise, async/await Go: goroutine, channel Kotlin: Coroutine Java: java.util.concurrent (1.5, 8.0) Scala: Future ReactiveX チュートリアルを見れば それっぽい物は書ける...

Slide 7

Slide 7 text

「スレッドセーフじゃなくない?」 そんなときコードレビューで...!! 非同期処理にしたはずが画面フリーズ! エラーが出たけど原因をたどれない... さらにランタイム(本番環境)で...

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

「非同期おもしろい」と思うキッカケを なにかひとつ見つけてほしい

Slide 10

Slide 10 text

今日のながれ • 歴史を学ぶ、各技術の背景とつながりを学ぶ • 抽象度の低いものから高いものへと少しずつ学ぶ

Slide 11

Slide 11 text

マルチスレッド Multi-threaded Concurrent Asynchronous 平行 非同期 用語について

Slide 12

Slide 12 text

マルチスレッド Multi-threaded Concurrent Asynchronous 平行 用語について このスライドでは「非同期」という単語をよく使うが 平行・マルチスレッド処理でもある物が中心 非同期

Slide 13

Slide 13 text

インターネット・モバイルユーザの増加と CPU性能の変遷

Slide 14

Slide 14 text

Our World in Data より引用 https://ourworldindata.org/internet 2016年にインターネット ユーザ34億人

Slide 15

Slide 15 text

Statista より引用 https://www.statista.com/statistic s/263437/global-smartphone-sales-t o-end-users-since-2007/ スマートフォン出荷台数 2018年に15億台 スマートフォン所有者の統 計を見つけられなかった

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

CPUクロック速度の変遷 2005年前後で3.4GHzに 達している https://twitter.com/csgillespie/sta tus/732532249325907968

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

この年表をベースにさらに様々な技術の変遷を 追っていきます 注意) 私はScalaプログラマなので Java, Scalaに関する話が多くなります ただし他の言語でも通用する話が多いです

Slide 20

Slide 20 text

Java Memory Model と Java 5 の非同期処理

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

Oracle Concurrency guide https://docs.oracle.com/javase/tutorial/essentia l/concurrency/ 今日一番覚えておいて ほしい資料!!!

Slide 24

Slide 24 text

Thread & Runnable public class MyRunnable implements Runnable { public void run() { ... } } Thread thread = new Thread(new MyRunnable()); thread.start();

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

A Swing programmer deals with the following kinds of threads: ● Initial threads, the threads that execute initial application code. ● The event dispatch thread, where all event-handling code is executed. Most code that interacts with the Swing framework must also execute on this thread. ● Worker threads, also known as background threads, where time-consuming background tasks are executed. スレッド使用例 Swing guide UI framework https://docs.oracle.com/javase/tutorial/uiswing /concurrency/index.html

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

java.util.concurrent (Java 5.0 以降)

Slide 31

Slide 31 text

ExecutorService ExecutorService service = …; service.execute(runnable);

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

非同期で起こる問題の一例

Slide 36

Slide 36 text

thread interference (非atomic処理) class Counter { private int c = 0; public void increment() { c++; } public void decrement() { c--; } public int value() { return c; } }

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

1. Thread A: int c 取得 2. Thread B: int c 取得 3. Thread A: 取得した値をIncrement 4. Thread B: 取得した値をDecrement 5. Thread A: cに1を書き込み 6. Thread B: cに-1を書き込み (6が5を上書き)

Slide 40

Slide 40 text

synchronized class Counter { private int c = 0; public synchronized void increment() { c++; } public synchronized void decrement() { c--; } public int value() { return c; } }

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

synchronized atomic happens-before

Slide 45

Slide 45 text

happens-before

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

data race (memory-consistency error)

Slide 50

Slide 50 text

順番(happens-before)があれば 期待される状態を導ける

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

少なくともどちらか一方が writeである場合 conflicting access data race (問題) の原因

Slide 53

Slide 53 text

Java Memory Model Java 5.0 (1.5) からの導入 https://www.cs.umd.edu/~pugh/java/memoryModel /jsr133.pdf http://gee.cs.oswego.edu/dl/jmm/cookbook.html http://www.cs.umd.edu/~pugh/java/memoryModel/

Slide 54

Slide 54 text

Java 5.0ではSynchronizedの他にも data raceを避けるツールが導入された

Slide 55

Slide 55 text

java.util.concurrent.locks Lock ReadWriteLock Condition ReentrantLock ...

Slide 56

Slide 56 text

volatile “write to a volatile variable establishes a happens-before relationship with subsequent reads of that same variable” volatile int counter = 0;

Slide 57

Slide 57 text

atomic java.util.concurrent.atomic AtomicInteger AtomicBoolean AtomicLong AtomicReference ... //CAS operation boolean compareAndSet(expectedValue, updateValue); CASはCPUでサポートされた操作 java.util.concurrent.atomicはそれを利用する

Slide 58

Slide 58 text

 1.CAS成功例

Slide 59

Slide 59 text

 2.CAS成功例

Slide 60

Slide 60 text

 3.CAS成功例 memory location value == expected

Slide 61

Slide 61 text

 1.CAS失敗例

Slide 62

Slide 62 text

 2.CAS失敗例

Slide 63

Slide 63 text

 3.CAS失敗例 memory location value != expected

Slide 64

Slide 64 text

thread-safe collections java.util.concurrent ConcurrentHashMap ConcurrentLinkedQueue ... CASを利用

Slide 65

Slide 65 text

● Java Memory Model 仕様 ○ happens-before ○ volatile, synchonized, locks ● java.util.concurrency ツール ○ locks, atomic, ExecutorService, thread-safe collections ○ これらをうまく使うパターン、抽象度の更に高いツールは後年 Java 1.4 -> 5.0 時代のまとめ

Slide 66

Slide 66 text

OSとCPU

Slide 67

Slide 67 text

Netflixのパフォーマンス分析エンジニア Brendan Gregg氏が2013年に書いた CPUやメモリの動作がOSレベルでどう使わ れているかについて参考になる章がある http://www.brendangregg.com/sysperfbook.html

Slide 68

Slide 68 text

No content

Slide 69

Slide 69 text

CPUとキャッシュ Stack Exchange - Where exactly L1, L2 and L3 Caches located in computer? https://superuser.com/questions/1961 43/where-exactly-l1-l2-and-l3-caches-loc ated-in-computer キャッシュは「スレッド ごとのメモリ空間」に関 わる -> data race -> happens-before

Slide 70

Slide 70 text

CPUとキャッシュ Stack Exchange - Where exactly L1, L2 and L3 Caches located in computer? https://superuser.com/questions/1961 43/where-exactly-l1-l2-and-l3-caches-loc ated-in-computer キャッシュは「スレッド ごとのメモリ空間」に関 わる -> data race -> happens-before data race (memory-consistency error)

Slide 71

Slide 71 text

No content

Slide 72

Slide 72 text

No content

Slide 73

Slide 73 text

No content

Slide 74

Slide 74 text

AjaxとGoogle Maps

Slide 75

Slide 75 text

No content

Slide 76

Slide 76 text

Google Maps以前

Slide 77

Slide 77 text

AjaxとGoogle Maps

Slide 78

Slide 78 text

Event LoopとAjax

Slide 79

Slide 79 text

No content

Slide 80

Slide 80 text

event loop

Slide 81

Slide 81 text

main() function funC(c) { … //make an ajax call } function funcB(b) { return funcC(b); } function funcA(a) { return funcB(a); } funcA(“my user data string”); call stack event loop

Slide 82

Slide 82 text

funcA() main() function funC(c) { … //make an ajax call } function funcB(b) { return funcC(b); } function funcA(a) { return funcB(a); } funcA(“my user data string”); call stack event loop

Slide 83

Slide 83 text

funcB() funcA() main() function funC(c) { … //make an ajax call } function funcB(b) { return funcC(c); } function funcA(a) { return funcB(a); } funcA(“my user data string”); call stack event loop

Slide 84

Slide 84 text

funcB() funcA() main() function funC(c) { … //make an ajax call } function funcB(b) { return funcC(b); } function funcA(a) { return funcB(a); } funcA(“my user data string”); funcC() call stack event loop

Slide 85

Slide 85 text

funcB() funcA() main() function funC(c) { … //make an ajax call } function funcB(b) { return funcC(c); } function funcA(a) { return funcB(a); } funcA(“my user data string”); funcC() call stack event loop ajax コール

Slide 86

Slide 86 text

funcB() funcA() main() function funC(c) { … //make an ajax call } function funcB(b) { return funcC(c); } function funcA(a) { return funcB(a); } funcA(“my user data string”); call stack event loop

Slide 87

Slide 87 text

funcB() funcA() main() function funC(c) { … //make an ajax call } function funcB(b) { return funcC(c); } function funcA(a) { return funcB(a); } funcA(“my user data string”); call stack event loop

Slide 88

Slide 88 text

funcA() main() function funC(c) { … //make an ajax call } function funcB(b) { return funcC(c); } function funcA(a) { return funcB(a); } funcA(“my user data string”); call stack event loop

Slide 89

Slide 89 text

main() function funC(c) { … //make an ajax call } function funcB(b) { return funcC(c); } function funcA(a) { return funcB(a); } funcA(“my user data string”); call stack event loop

Slide 90

Slide 90 text

function funC(c) { … //make an ajax call } function funcB(b) { return funcC(c); } function funcA(a) { return funcB(a); } funcA(“my user data string”); event loop ajax コールバック タスクキュー

Slide 91

Slide 91 text

タスクキューも含めたアニメーション

Slide 92

Slide 92 text

ajax コール

Slide 93

Slide 93 text

ajax コールバック

Slide 94

Slide 94 text

No content

Slide 95

Slide 95 text

No content

Slide 96

Slide 96 text

No content

Slide 97

Slide 97 text

● スレッドを意識せずにコールバックのみで非同期処理 ● Event Loop ● 非同期処理が庶民の手に! AjaxとGoogle Mapsのまとめ

Slide 98

Slide 98 text

C10k problem

Slide 99

Slide 99 text

引用元: https://news.netcraft.com/archives/2019/02/28/february-2019-web-server-survey.html

Slide 100

Slide 100 text

引用元: https://news.netcraft.com/archives/2019/02/28/february-2019-web-server-survey.html

Slide 101

Slide 101 text

No content

Slide 102

Slide 102 text

No content

Slide 103

Slide 103 text

同時に走るスレッドは 高々CPUコア数

Slide 104

Slide 104 text

同時に走るスレッドは 高々CPUコア数

Slide 105

Slide 105 text

同時に走るスレッドは 高々CPUコア数

Slide 106

Slide 106 text

同時に走るスレッドは 高々CPUコア数

Slide 107

Slide 107 text

No content

Slide 108

Slide 108 text

The Node.js Event Loop, Timers, and process.nextTick() https://nodejs.org/uk/docs/guides/event-loop-time rs-and-nexttick/#event-loop-explained

Slide 109

Slide 109 text

No content

Slide 110

Slide 110 text

No content

Slide 111

Slide 111 text

ajax コール

Slide 112

Slide 112 text

タイマーが指定時間に達していない2タスク

Slide 113

Slide 113 text

No content

Slide 114

Slide 114 text

No content

Slide 115

Slide 115 text

ajax コールバック

Slide 116

Slide 116 text

タイマー更新

Slide 117

Slide 117 text

タイマー更新

Slide 118

Slide 118 text

No content

Slide 119

Slide 119 text

No content

Slide 120

Slide 120 text

No content

Slide 121

Slide 121 text

No content

Slide 122

Slide 122 text

No content

Slide 123

Slide 123 text

No content

Slide 124

Slide 124 text

c10k problemまとめ ● OS thread生成やOS threadのコンテキストスイッチのコスト ● Event Loop、Event駆動モデル ● コールバック重要

Slide 125

Slide 125 text

JavaScript promise, async/await

Slide 126

Slide 126 text

http://callbackhell.com/

Slide 127

Slide 127 text

Promiseコード例 JavaScript Promiseの本 http://azu.github.io/promises-book/#pro mise-chain

Slide 128

Slide 128 text

async/await コード例 JavaScript Promiseの本 http://azu.github.io/promises-book/#pro mise-chain

Slide 129

Slide 129 text

Scala Futureとの類似性 Scala docs FUTURES AND PROMISES https://docs.scala-lang.org/overviews/co re/futures.html

Slide 130

Slide 130 text

No content

Slide 131

Slide 131 text

JavaScript promise, async/await まとめ ● Callback = 細分化された非同期処理 ● 非同期処理のChaining ○ ReactiveXなどのストリーム処理にも通じる ● 「書きやすさ」という進化の方向性

Slide 132

Slide 132 text

関数型プログラミングと immutable object

Slide 133

Slide 133 text

少なくともどちらか一方が writeである場合 conflicting accessは data race (問題) の原因

Slide 134

Slide 134 text

No content

Slide 135

Slide 135 text

No content

Slide 136

Slide 136 text

オブジェクトを変更する際は新しいインスタンスを作 成、元のオブジェクトはそのまま

Slide 137

Slide 137 text

Oracle Concurrency guide もimmutable objectに 言及している ● setterダメ ● final, private ● ...

Slide 138

Slide 138 text

No content

Slide 139

Slide 139 text

Akkaとactor model

Slide 140

Slide 140 text

rich, realtime -> 状態 ?

Slide 141

Slide 141 text

IDを持つオブジェクトの内部状態が変化する例

Slide 142

Slide 142 text

IDでクエリ

Slide 143

Slide 143 text

IDでクエリ

Slide 144

Slide 144 text

IDを持つオブジェクトのインスタンスが 複数スレッドに存在する場合

Slide 145

Slide 145 text

どのスレッドに対して クエリ?

Slide 146

Slide 146 text

デーモンスレッドにオブジェクトのインスタンスを保持

Slide 147

Slide 147 text

デーモンスレッドにオブジェクトのインスタンスを保持

Slide 148

Slide 148 text

デーモンスレッドにオブジェクトのインスタンスを保持

Slide 149

Slide 149 text

No content

Slide 150

Slide 150 text

クエリはできたしかし...

Slide 151

Slide 151 text

少なくともどちらか一方が writeである場合 conflicting accessは data race (問題) の原因

Slide 152

Slide 152 text

conflicting accessはの正しい管理は難しい

Slide 153

Slide 153 text

conflicting accessはの正しい管理は難しい

Slide 154

Slide 154 text

shared mutable: 複雑さの元凶 shared mutable:おもしろさの源

Slide 155

Slide 155 text

アプリケーションの状態をすべて データベースで管理する方法

Slide 156

Slide 156 text

データベース周りの ソースコードが複雑

Slide 157

Slide 157 text

複雑さのバランスを アプリケーション側 との間でとる

Slide 158

Slide 158 text

オブジェクトの内部状態

Slide 159

Slide 159 text

Actorでオブジェクトの内部状態を隠蔽

Slide 160

Slide 160 text

Actorどうしはメッセージを送り合って通信

Slide 161

Slide 161 text

Akka actorコードサンプル actor ! message class MyActor extends Actor { var state = ... def receive = { case MessageTypeX => ... case MessageTypeY => ... case MessageTypeZ => ... } }

Slide 162

Slide 162 text

SenderはReceiverのスレッドセーフなキューに メッセージを送る

Slide 163

Slide 163 text

No content

Slide 164

Slide 164 text

複数Senderから同時に メッセージを送ることが可能

Slide 165

Slide 165 text

thread-safe collections java.util.concurrent ConcurrentHashMap ConcurrentLinkedQueue ... CASを利用 Akka actorのメッセージキューは デフォルトで ConcurrentLinkedQueue

Slide 166

Slide 166 text

thread-safe collections java.util.concurrent ConcurrentHashMap ConcurrentLinkedQueue ... CASを利用 Akka actorのメッセージキューは デフォルトで ConcurrentLinkedQueue

Slide 167

Slide 167 text

Receiver側の動作を追っていく

Slide 168

Slide 168 text

No content

Slide 169

Slide 169 text

単一のスレッドがReceiverの receiveメソッドを走らせる スレッド1 スレッド2

Slide 170

Slide 170 text

スレッド1 スレッド2 Receiverはキューから一つずつ メッセージを取り出し処理する

Slide 171

Slide 171 text

スレッド1 スレッド2 Receiverの実行スレッドは 入れ替わることがある

Slide 172

Slide 172 text

ActorのReceiveメソッドは いかなる時も最大一つのスレッド によって実行 スレッド0 スレッド1 スレッド2

Slide 173

Slide 173 text

スレッド0 スレッド1 Receiverはキューからメッセージ がなくなったら次を待つ

Slide 174

Slide 174 text

Akka official documentation https://doc.akka.io/docs/akka/current/general/jmm. html#actors-and-the-java-memory-model 自分でvolatileを使う 必要はない Akkaが面倒を見てくれる ActorのReceiveメソッドは いかなる時も最大一つのスレッド によって実行

Slide 175

Slide 175 text

No content

Slide 176

Slide 176 text

volatile “write to a volatile variable establishes a happens-before relationship with subsequent reads of that same variable”

Slide 177

Slide 177 text

> さらにvolatileな変数をread するとき、read側のスレッドは 最新のvolatile変数の変更のみ ならず、そこへ至るまでのコー ドの副作用まで観測することに なる

Slide 178

Slide 178 text

Akka actor modelまとめ ● shared mutableは難しいが重要な場合がある ● actor modelはshared mutable管理の一つの解 ● AkkaはJava 5.0時代からのツールを内部で使う

Slide 179

Slide 179 text

関数型方面の進化 (Scala)

Slide 180

Slide 180 text

Scalaで非同期処理を主要機能に含むライブラリ Scala標準 Monix Cats Effect ZIO

Slide 181

Slide 181 text

共通なパターン

Slide 182

Slide 182 text

Cats Effect SemaphoreやMVarなどの 低レベルな非同期処理の パーツを acquire, releaseなどの コンビネータとともに定義 https://typelevel.org/cats-effect/

Slide 183

Slide 183 text

Cats Effect Scalaのfor文とモナドを組 み合わせるテクニックに よってChainingを実現 型安全なので各処理ステッ プの戻り値型とエラー型が 合わなければコンパイラが エラーで教えてくれる https://typelevel.org/cats-effect/

Slide 184

Slide 184 text

https://typelevel.org/cats-effect/

Slide 185

Slide 185 text

ZIO try/catchブロックを型安全に 行う例 ファイルやデータベースのリ ソース開放に便利 https://zio.dev/

Slide 186

Slide 186 text

ZIO こちらもコンビネータを使って Chainingを行うことができる https://zio.dev/

Slide 187

Slide 187 text

No content

Slide 188

Slide 188 text

No content

Slide 189

Slide 189 text

非同期処理進化の方向性 ● 処理の細分化・書きやすさ ● 抽象化 ● 堅牢性 ● 効率

Slide 190

Slide 190 text

自分の過去 ● 新卒から9年間自社言語: シングルスレッド・同期IOのみ ● Javaの非同期怖かった ● actor modelの実装であるAkkaに興味を持つ

Slide 191

Slide 191 text

非同期処理を楽しく学ぶ ● わかりにくかったら抽象度の低いものを先に学ぶのもアリ ● 今回の発表からひとつだけでも興味を持って欲しい

Slide 192

Slide 192 text

マーベリックではエンジニア募集中

Slide 193

Slide 193 text

文献 Our World in Data https://ourworldindata.org/internet 世界のインターネットユーザ数の統計。 Statista https://www.statista.com/statistics/... 年間スマートフォン出荷台数の統計。 https://twitter.com/csgillespie/status/… CPUクロック周波数に関するグラフ付きツイート。

Slide 194

Slide 194 text

Oracle Concurrency guide https://docs.oracle.com/javase/tutorial/… Java 5.0やそれ以前から続く非同期処理技術に詳しい。 Computer Hope processor history https://www.computerhope.com/history/processor.htm AMDが2005年に初のdual-coreを発売など。 Java Memory ModelとJava 5.0 Oracle Concurrency in Swing guide https://docs.oracle.com/javase/tutorial/uiswing/... UIでのスレッド管理プラクティスとして一部今も通用する。

Slide 195

Slide 195 text

The JSR-133 Cookbook for Compiler Writers  http://gee.cs.oswego.edu/dl/jmm/cookbook.html JSR-133に深く関わったDoug Lea教授による情報。 The Java Memory Model  http://www.cs.umd.edu/~pugh/java/memoryModel/ JSR-133仕様書に載っていない周辺情報。 Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms https://www.cs.rochester.. ConcurrentLinkedQueue実装に使われたアルゴリズム。 JSR-133 https://www.cs.umd.edu/~pugh/… Java Memory Model仕様書。happens-beforeを始め様々な概 念やコンパイラ最適化の影響などが解説されている。

Slide 196

Slide 196 text

OSとCPU Systems Performance https://www.amazon.com/gp… Netflixのパフォーマンス分析エンジニアBrendan Gregg氏に よる著書。CPUとスレッドについての章がある。 Brendan Gregg’s Home page http://www.brendangregg.com/overview.html Brendan Gregg氏の著書にも関わる様々な情報がある See How a CPU works https://youtu.be/cNN_tTXABUA Scott CPUという教育用の仮想的なCPUを題材に動画で解説 している。

Slide 197

Slide 197 text

AjaxとGoogle Maps YouTube: Screen record of Google Maps in 2005 https://youtu.be/PDG6tELjCOE 一般ユーザによる録画と思われる。 YouTube: What the heck is the event loop anyway? JSConf https://youtu.be/8aGhZQkoFbQ アニメーションを駆使したevent loop解説。100万再生以上。

Slide 198

Slide 198 text

C10k problem ゆううきブログ: 2015年Webサーバアーキテクチャ序論 https://youtu.be/PDG6tELjCOE 現さくらインターネット研究所の坪内佑樹さんのブログ。C10k 問題や当時のサーバアーキテクチャを画像とともに解説。 The Node.js Event Loop, Timers, and process.nextTick() https://nodejs.org/uk/docs/guides/... 公式ドキュメント。各フェーズ毎の詳細な解説。 GitHub: libuv https://github.com/libuv/libuv/... node.js内部で使われているイベントループの実装を含む非同 期I/Oライブラリ。Cで書かれている。

Slide 199

Slide 199 text

Inside NGINX: How We Designed for Performance & Scale https://www.nginx.com/blog/... nginx公式のアーキテクチャ解説。 MDN web docs: Concurrency model and Event Loop https://developer.mozilla.org/en-US/docs/... MozillaによるEvent Loop解説 JavaScript Promiseの本 https://azu.github.io/promises-book/ JavaScriptを中心に著名なエンジニアであるazu氏が書いた Promiseおよびasync/awaitを解説したウェブ上の本 JavaScript promise, async/await

Slide 200

Slide 200 text

Akka docs: https://akka.io/docs/ 公式のドキュメント edX: Programming Reactive Systems https://www.edx.org/... AkkaのメンテナであったKonrad Malawski氏が中心となって 作ったオンライン学習コース Scala: Futures and Promises https://docs.scala-lang.org/overviews/core/futures.html Scala公式のFutureのドキュメント。Chainingの参考になる。 Akkaとactor model

Slide 201

Slide 201 text

関数型方面の進化(Scala) Monix https://monix.io/ イベント駆動で高パフォーマンスな非同期プログラムを書くサ ポートをするライブラリ。 Cats Effect https://typelevel.org/cats-effect/ I/Oを表す型を提供するライブラリ。同期および非同期の Effectを表現することができる。 ZIO https://zio.dev/ 型安全でcomposableで非同期な処理をかけるライブラリ。

Slide 202

Slide 202 text

YouTube: The Making of an IO - Daniel Spiewak https://youtu.be/g_jP47HFpWA 関数型プログラムと非同期処理の関係を説明。Cats Effectの思想 やスレッドプール使い分けベストプラクティスにも触れる