Haskellで並行プログラミングの練習

 Haskellで並行プログラミングの練習

1a679952cdf455ecd6a15cbde7ae80d5?s=128

Tomohiko Himura

May 08, 2016
Tweet

Transcript

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

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

  3. None
  4. None
  5. 言葉にすれば 世界は変えられる

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

  7. なぜ並行プログラミング

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

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

  10. コアの数は増える

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

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

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

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

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

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

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

  18. IUUQRJJUBDPNTVJOJUFNTFDCG⒎EGE

  19. None
  20. 1秒かかる処理 2秒かかる処理 3秒かかる処理

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

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

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

  24. たとえば javaで • 1クライアント 1スレッド割り当てる • サーバープロセスを考える • 320kb *

    10,000 -> 約3GB
  25. Goルーチンなら いっぱいつくれる

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

  27. None
  28. Αʔ͠ HaskellͰ΋΍ͬͯΈΑ͏

  29. None
  30. None
  31. threadDelay マイクロ秒待てる

  32. 6秒かかる

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

  34. \

  35. None
  36. > だいたい同じ <

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

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

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

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

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

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

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

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

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

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

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

  48. 綺麗に表示された

  49. めでたしめでたし

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

  51. ·ͱΊ

  52. 並行処理 • Communicating Sequential Processes • ってのが元になっている模様 • erlangやakka •

    アクターモデル • そのまま分散できる • どちらもメッセージパッシング
  53. CSP • いままでどおりかけて見通しがよい • 結構いろんな言語で使える模様

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

    より良いコードがかけるはず