Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Haskellで並行プログラミングの練習
Search
Tomohiko Himura
May 08, 2016
Programming
0
280
Haskellで並行プログラミングの練習
LT駆動25
https://github.com/LTDD/Sessions/wiki/LT%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA25
Tomohiko Himura
May 08, 2016
Tweet
Share
More Decks by Tomohiko Himura
See All by Tomohiko Himura
アジャイルはさておきMake People Awesomeしたい
eiel
0
48
レビューは最優先にするようにしている
eiel
0
170
再考 Fourkeys メトリクス
eiel
2
530
Test mockをSnapshot testする
eiel
0
62
devenvに入門した
eiel
0
46
関数プログラミングの考え方
eiel
0
110
逆コンウェイ作戦はフィードバックループを作るために 逆向きの流れをつくること (5分版)
eiel
0
200
組織のパフォーマンスを高めるために 第1話 学習と文化
eiel
0
150
チームとチームのチーム
eiel
1
1.9k
Other Decks in Programming
See All in Programming
Designing for tomorrow's programming workflows
honnibal
PRO
2
120
入門 AWS Amplify Gen2 / Introduction to AWS Amplify Gen2
genkiogasawara
1
330
使ってみよう Azure AI Document Intelligence
kosmosebi
2
280
Amazon SQSコンシューマー疎結合への旅 - 出張! #DevelopersIO IT技術ブログの中の人が語る勉強会 #3
quiver
0
230
if constexpr文はテンプレート世界のラムダ式である
faithandbrave
3
640
ゆるい個人開発のススメ
kuroppe1819
10
980
⼤規模⾔語モデルの拡張(RAG)が 終わったかも知れない件について
nearme_tech
23
15k
PHP8.3の機能を振り返る / Review of PHP 8.3 features
seike460
PRO
1
110
Behind VS Code Extensions for JavaScript / TypeScript Linnting and Formatting
unvalley
5
890
PHPはいつから死んでいるかの調査
chiroruxx
1
380
検証も兼ねて個人開発でHonoとかと向き合った話
hanetsuki
0
500
Rethinking UI building strategies @ SFI 2024
letelete
0
270
Featured
See All Featured
What the flash - Photography Introduction
edds
64
11k
Large-scale JavaScript Application Architecture
addyosmani
504
110k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
357
22k
What's in a price? How to price your products and services
michaelherold
237
11k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
322
20k
The Brand Is Dead. Long Live the Brand.
mthomps
49
28k
YesSQL, Process and Tooling at Scale
rocio
164
13k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
19
1.7k
Gamification - CAS2011
davidbonilla
76
4.6k
Fantastic passwords and where to find them - at NoRuKo
philnash
37
2.5k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
352
28k
Visualization
eitanlees
136
14k
Transcript
HaskellͰ ฒߦϓϩάϥϛϯάͷ࿅श 2016-05-07 LTۦಈ։ൃ25
ͻΉΒ ͱͻ͜ ฒߦ ฒྻ ࢄ ͲΕ͍͠
None
None
言葉にすれば 世界は変えられる
ฒߦϓϩάϥϛϯά Λ͡ΊͯΈΔ
なぜ並行プログラミング
CPUはもう速くならないらしい
速くならないけど 幅は広くなるらしい
コアの数は増える
複数のコアを有効に使わなければ プログラムは速くならない
複数のコアを使って 別々のタスクを実行する
ノンブロッキングI/Oの登場で 効果がでやすい(要出典)
コアの複数化で 効果がでやすい(要出典)
並列処理より入門しやすい
並行処理といえば Go言語らしい
真似をするところから はじめよう
IUUQRJJUBDPNTVJOJUFNTFDCG⒎EGE
None
1秒かかる処理 2秒かかる処理 3秒かかる処理
Go言語では Goルーチンとチャンネル で並行化
1秒かかる処理 2秒かかる処理 3秒かかる処理 終わるの待つ
Goルーチン • 軽量スレッド • 数kbしかつかわない • javaのスレッドは320kbとか使うらしい • 関数呼び出しに goってつけるだけ
たとえば javaで • 1クライアント 1スレッド割り当てる • サーバープロセスを考える • 320kb *
10,000 -> 約3GB
Goルーチンなら いっぱいつくれる
チャネル • Goルーチンがやり取りするのに利用 • メッセージパッシング • 共有メモリではなく • メッセージが入ってくるまで待つ
None
Αʔ͠ HaskellͰͬͯΈΑ͏
None
None
threadDelay マイクロ秒待てる
6秒かかる
(P )BTLFMM ฒߦԽ HP͚ͬͯͭΔ GPSL*0͚ͬͯͭΔ ௨৴ νϟωϧΛ͔ͭ͏ .7BSΛ͔ͭ͏
\
None
> だいたい同じ <
forkIO :: IO () -> IO ThreadId 第1引数を別のスレッドで実行
MVar 値が入ってくる前に 読み込みしようとすると 値が入ってくるまで待つ
予定どおり3秒で実行できた
ॻ͖ࠐΈΛ ผεϨουʹͯ͠ΈΔ
同時に実行すると出力が混ざる
軽量スレッドは プリエンプティブ 短い時間でスレッドが切り替わっている
出力は同一スレッドで やってみる
Control.Concurrent.Chan MVarみたいな無限キュー
Endがやってくるまで Chan を読み続けて 画面に表示 Endがやってきたら finished(MVar)に値を書き込み スレッドの終了を通知
ChanはMVarをつかって 実装されている
軽量スレッドとMVar が並行処理の基本単位
綺麗に表示された
めでたしめでたし
ファイルへの出力より ログの生成が早いと メモリがあふれるので注意
·ͱΊ
並行処理 • Communicating Sequential Processes • ってのが元になっている模様 • erlangやakka •
アクターモデル • そのまま分散できる • どちらもメッセージパッシング
CSP • いままでどおりかけて見通しがよい • 結構いろんな言語で使える模様
まとめ • HaskellでGoのコードは真似られそう • しかし、全く同じように動くわけではない • 正しく違いを理解しないといけない • HaskellはIOが型で分離される •
より良いコードがかけるはず