Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
【Crystal】Concurrency
Search
at_grandpa
July 18, 2018
Technology
970
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
【Crystal】Concurrency
crystal.tokyo #7 での発表資料です。
https://crystal.connpass.com/event/93629/
at_grandpa
July 18, 2018
More Decks by at_grandpa
See All by at_grandpa
技術書典5でチャレンジしたあれこれ
atgrandpa
3
2k
CSS組版おもしろい!
atgrandpa
1
340
Rubyを好きになった過程
atgrandpa
3
1.6k
技術同人誌を執筆して得たこと
atgrandpa
3
1.7k
【Crystal】Macroについて
atgrandpa
3
1.6k
初のサークル参加で気づいた小さなこと
atgrandpa
0
530
Other Decks in Technology
See All in Technology
Adversary Infrastructure Hunting101
disconinja
0
190
Deep Data Security 機能解説
oracle4engineer
PRO
3
990
Devin プロモコードの受け取りと適用(2026.10.27)
kinopeee
1
820
素人でもできた!AIを使った短編小説創作入門
delhi09
PRO
0
280
【Oracle AI SPOTLIGHT ウェビナー】事例から見る!なぜOCIが選ばれたのか ― AI時代のクラウド戦略を紐解く ―
oracle4engineer
PRO
1
150
複雑な業務システムを高速でつくるため、チーム全員をつくれる人へ
ayakurabuchi
0
120
cdk deployとcdkd deploy、実際にデプロイして5倍速近くの差を実測した
yama3133
1
160
生き様としてのSRE
hokkai7go
1
150
渡米前の準備を制す!re:Invent 2026徹底準備術 / The Ultimate Preparation Guide for re:Invent 2026
yuj1osm
1
490
Autonomous AI Lakehouse - Live AI Hubから始めるセキュアなAIデータ活用 -
oracle4engineer
PRO
2
180
FinOpsを導入してマルチプロダクトのコスト最適化を実現する
kworkdev
PRO
0
110
AI時代の開発はウォーターフォールに回帰する? / development-with-ai-back-to-wf
okamototakuyasr2
0
170
Featured
See All Featured
StorybookのUI Testing Handbookを読んだ
zakiyama
31
7k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
43k
Fireside Chat
paigeccino
43
4.1k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
670
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.3k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Odyssey Design
rkendrick25
PRO
2
910
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
340
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.9k
Transcript
Concurrency 2018.07.18 @at_grandpa Crystal.tokyo #7 in 渋谷
@at_grandpa
圧倒亭グランパのブログ
Concurrency
✔ Concurrency の雰囲気を話します ✔ 細かい syntax などはドキュメント参照
None
“as in Go or Clojure” ✔ Go の goroutine/channel とほぼ同じ
終了!
Concurrency の中身を ちょっと覗いてみましょう
サンプルコード ✔ 並行処理 ✔ 各処理からの値の取得
None
String型のChannelをインスタンス化
2つのFiberを生成
Channel経由で値を取得
2018-07-18 08:12:50 +09:00 start 2018-07-18 08:12:50 +09:00 [fiber 1] start
2018-07-18 08:12:50 +09:00 [fiber 2] start 2018-07-18 08:12:55 +09:00 [top level] value: send from fiber 1 2018-07-18 08:12:55 +09:00 [fiber 1] end 2018-07-18 08:13:00 +09:00 [top level] value: send from fiber 2 2018-07-18 08:13:00 +09:00 end
2018-07-18 08:12:50 +09:00 start 2018-07-18 08:12:50 +09:00 [fiber 1] start
2018-07-18 08:12:50 +09:00 [fiber 2] start 2018-07-18 08:12:55 +09:00 [top level] value: send from fiber 1 2018-07-18 08:12:55 +09:00 [fiber 1] end 2018-07-18 08:13:00 +09:00 [top level] value: send from fiber 2 2018-07-18 08:13:00 +09:00 end ・並行に動いている ・値も取れている
どういう仕組みで動いているか
✔ Fiber ✔ Runtime Scheduler ✔ Event Loop ✔ Channel
✔ IO::Syscall Concurrencyを理解するポイント
Fiber ✔ Process ⊃ Thread ⊃ Fiber ✔ 協調マルチタスク -
Fiber自ら、処理を他のFiberに委譲する - 1つのFiberが固まるとシステム全体が固まる ✔ Crystalの処理は全てFiberで行われている - 「Main Fiber」でメインの処理を実行している
Runtime Scheduler ✔ Fiberの切り替えを担当 ✔ クラス変数にFiberのqueueを持っている - @@runnables = Deque(Fiber).new
- 実行可能Fiberのqueue ✔ Scheduler.rescheduleで切り替え
Event Loop ✔ I/O処理の委譲先 ✔ 委譲している間に別のFiberを実行できる ✔ I/O処理が終了したら委譲元のFiberに移る
Channel ✔ Fiber間のデータのやりとり ✔ 送信元Fiberや受信先Fiberを保持 - @senders = Deque(Fiber).new -
@receivers = Deque(Fiber).new ✔ 送受信時にFiberを切り替え - Runtime Scheduler を使う
IO::Syscall ✔ 以下でincludeされている - Crystal::System::FileDescriptor - Socket ✔ read/writeでFiber切り替え -
Runtime Scheduler を使う ほぼ全てのI/Oを網羅
実際の動き追う
None
Channelをインスタンス化
・Fiber1を定義 ・Runtime Scheduler の 実行可能Fiberのqueueに Fiber1が enqueue される
concurrency.cr ・Fiber1を定義 ・Runtime Scheduler の 実行可能Fiberのqueueに Fiber1が enqueue される
・Fiber2を定義 ・Runtime Scheduler の 実行可能Fiberのqueueに Fiber2が enqueue される
・実際の処理はここから開始 ・Top Level のコードは 「Main Fiber」で動いている ・Channelの送受信時には Fiberの切り替えが行われる
・実際の処理はここから開始 ・Top Level のコードは 「Main Fiber」で動いている ・Channelの送受信時には Fiberの切り替えが行われる ・Runtime Scheduler
の 実行可能Fiberのqueue からshift ・Fiber1に処理が移る
・Fiber1に処理が移った
・sleep
concurrency.cr
concurrency.cr fiber.cr
concurrency.cr fiber.cr ・Event Loop に処理を委譲 ・Runtime Scheduler で queueの次のFiber切り替え
concurrency.cr fiber.cr ・Event Loop に処理を委譲 ・Runtime Scheduler で queueの次のFiber切り替え ・Fiber2へ移る
・Fiber2に処理が移った
・同じくFiber切り替え ・しかし、もう 実行可能Fiberのqueueには Fiberが存在しない ・I/O処理を待機するしかない
待機中 . . .
・Event Loop が sleep 5 の 終了を検知 ・処理中のFiberが他にいないので Fiber1の処理が再開される
・Channelに値を送信 ・sendの場合はreceiveを 呼んだFiberに切り替え ・Main Fiber に切り替わる ・このとき、sendしたFiberを Schedulerのqueueにenqueue
・Channelに値を送信 ・sendの場合はreceiveを 呼んだFiberに切り替え ・Main Fiber に切り替わる ・このとき、sendしたFiberを Schedulerのqueueにenqueue
・受信された値を表示
・Schedulerの 実行可能Fiberのqueueを元に Fiberの切り替え ・queueにはsendした際に enqueueされたFiber1が入っている
・Schedulerの 実行可能Fiberのqueueを元に Fiberの切り替え ・queueにはsendした際に enqueueされたFiber1が入っている ・Fiber1が再開
・値の表示
・Fiber1のブロックが終了 ・Fiberの切り替えが発生 ・しかし、Schedulerの queueには実行可能Fiberが 存在しない
待機中 . . .
・Event Loop が sleep 10 の 終了を検知 ・処理中のFiberが他にいないので Fiber2に処理が戻る
・Channelに値を送信 ・sendの場合はreceiveを 呼んだFiberに切り替え ・Main Fiber に切り替わる ・このとき、sendしたFiberを Schedulerのqueueにenqueue
・Channelに値を送信 ・sendの場合はreceiveを 呼んだFiberに切り替え ・Main Fiber に切り替わる ・このとき、sendしたFiberを Schedulerのqueueにenqueue
・受信された値を表示
・そのまま終了
・そのまま終了 ・ここは通らない
・そのまま終了 ・ここは通らない 2018-07-18 08:12:50 +09:00 start 2018-07-18 08:12:50 +09:00 [fiber
1] start 2018-07-18 08:12:50 +09:00 [fiber 2] start 2018-07-18 08:12:55 +09:00 [top level] value: send from fiber 1 2018-07-18 08:12:55 +09:00 [fiber 1] end 2018-07-18 08:13:00 +09:00 [top level] value: send from fiber 2 2018-07-18 08:13:00 +09:00 end [fiber 2] end は表示されてない
複雑!
とはいえ ✔ Concurrencyに必要な役者を知る - Fiber, Runtime Scheduler, Event loop, Channel
✔ Fiberが切り替わるタイミングを知る - I/Oの場合 - 実行可能Fiber-queueからshift - receiveの場合 - 実行可能Fiber-queueからshift - sendしたFiberをqueueにenqueue - sendの場合 - receiveしたFiberに切り替え これらを知るだけで、だいぶ変わる
まとめ
✔ 並行処理 ✔ Concurrencyに必要な役者を知ろう ✔ Fiberを切り替えるタイミングを知ろう Concurrency
✔ 立て続けにsendされたらどうなるの? - sendされた値もqueueに保存される - receiveを呼ぶ度にqueueからshift ✔ Fiber内でI/O以外の重い処理があったら? - 委譲できない処理はそのまま処理される
- その処理が終わるまで他のFiberは実行できない ✔ 入れ子spawnとかどうなるんだろう? - \(^o^)/ まだまだあるよ
Happy Crystalling ! fin