Slide 1

Slide 1 text

HaskellͰ ฒߦϓϩάϥϛϯάͷ࿅श 2016-05-07 LTۦಈ։ൃ25

Slide 2

Slide 2 text

ͻΉΒ ͱ΋ͻ͜ ฒߦ ฒྻ ෼ࢄ ͲΕ΋೉͍͠

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

言葉にすれば 世界は変えられる

Slide 6

Slide 6 text

ฒߦϓϩάϥϛϯά
 Λ͸͡ΊͯΈΔ

Slide 7

Slide 7 text

なぜ並行プログラミング

Slide 8

Slide 8 text

CPUはもう速くならないらしい

Slide 9

Slide 9 text

速くならないけど 幅は広くなるらしい

Slide 10

Slide 10 text

コアの数は増える

Slide 11

Slide 11 text

複数のコアを有効に使わなければ プログラムは速くならない

Slide 12

Slide 12 text

複数のコアを使って 別々のタスクを実行する

Slide 13

Slide 13 text

ノンブロッキングI/Oの登場で 効果がでやすい(要出典)

Slide 14

Slide 14 text

コアの複数化で 効果がでやすい(要出典)

Slide 15

Slide 15 text

並列処理より入門しやすい

Slide 16

Slide 16 text

並行処理といえば Go言語らしい

Slide 17

Slide 17 text

真似をするところから はじめよう

Slide 18

Slide 18 text

IUUQRJJUBDPNTVJOJUFNTFDCG⒎EGE

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

1秒かかる処理 2秒かかる処理 3秒かかる処理

Slide 21

Slide 21 text

Go言語では Goルーチンとチャンネル で並行化

Slide 22

Slide 22 text

1秒かかる処理 2秒かかる処理 3秒かかる処理 終わるの待つ

Slide 23

Slide 23 text

Goルーチン • 軽量スレッド • 数kbしかつかわない • javaのスレッドは320kbとか使うらしい • 関数呼び出しに goってつけるだけ

Slide 24

Slide 24 text

たとえば javaで • 1クライアント 1スレッド割り当てる • サーバープロセスを考える • 320kb * 10,000 -> 約3GB

Slide 25

Slide 25 text

Goルーチンなら いっぱいつくれる

Slide 26

Slide 26 text

チャネル • Goルーチンがやり取りするのに利用 • メッセージパッシング • 共有メモリではなく • メッセージが入ってくるまで待つ

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

Αʔ͠ HaskellͰ΋΍ͬͯΈΑ͏

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

threadDelay マイクロ秒待てる

Slide 32

Slide 32 text

6秒かかる

Slide 33

Slide 33 text

(P )BTLFMM ฒߦԽ HP͚ͬͯͭΔ GPSL*0͚ͬͯͭΔ ௨৴ νϟωϧΛ͔ͭ͏ .7BSΛ͔ͭ͏

Slide 34

Slide 34 text

\

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

> だいたい同じ <

Slide 37

Slide 37 text

forkIO :: IO () -> IO ThreadId
 第1引数を別のスレッドで実行

Slide 38

Slide 38 text

MVar 値が入ってくる前に
 読み込みしようとすると 値が入ってくるまで待つ

Slide 39

Slide 39 text

予定どおり3秒で実行できた

Slide 40

Slide 40 text

ॻ͖ࠐΈΛ
 ผεϨουʹͯ͠ΈΔ

Slide 41

Slide 41 text

同時に実行すると出力が混ざる

Slide 42

Slide 42 text

軽量スレッドは プリエンプティブ 短い時間でスレッドが切り替わっている

Slide 43

Slide 43 text

出力は同一スレッドで やってみる

Slide 44

Slide 44 text

Control.Concurrent.Chan MVarみたいな無限キュー

Slide 45

Slide 45 text

Endがやってくるまで Chan を読み続けて 画面に表示 Endがやってきたら finished(MVar)に値を書き込み スレッドの終了を通知

Slide 46

Slide 46 text

ChanはMVarをつかって 実装されている

Slide 47

Slide 47 text

軽量スレッドとMVar が並行処理の基本単位

Slide 48

Slide 48 text

綺麗に表示された

Slide 49

Slide 49 text

めでたしめでたし

Slide 50

Slide 50 text

ファイルへの出力より ログの生成が早いと メモリがあふれるので注意

Slide 51

Slide 51 text

·ͱΊ

Slide 52

Slide 52 text

並行処理 • Communicating Sequential Processes • ってのが元になっている模様 • erlangやakka • アクターモデル • そのまま分散できる • どちらもメッセージパッシング

Slide 53

Slide 53 text

CSP • いままでどおりかけて見通しがよい • 結構いろんな言語で使える模様

Slide 54

Slide 54 text

まとめ • HaskellでGoのコードは真似られそう • しかし、全く同じように動くわけではない • 正しく違いを理解しないといけない • HaskellはIOが型で分離される • より良いコードがかけるはず