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
Goの並行処理に入門しよう
Search
Shintaro Kanno
July 30, 2022
Programming
160
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Goの並行処理に入門しよう
Shintaro Kanno
July 30, 2022
More Decks by Shintaro Kanno
See All by Shintaro Kanno
アトミックデザイン入門
shintaro8
0
330
gRPCミドルウェアを作ってみよう
shintaro8
1
640
Azure Functionsを使ってSlackに通知をしてみよう
shintaro8
0
590
Other Decks in Programming
See All in Programming
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
220
源内ハンズオン概要編
hideg
0
210
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
230
VibeCodingからAgenticWorkflowへ
starfish719
0
890
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1.1k
仕様駆動開発の消費期限
watany
20
9k
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
350
属人化した知識を、 AIが辿れる地図にする
pkshadeck
PRO
1
210
Go 1.27 における memory allocation の高速化
andpad
0
330
いまどきの Codex で開発する visionOS アプリの開発スタイルについて
karad
0
160
異なる設計思想のフレームワークを経験して得た学び
amekuhideki
1
620
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
5
1.8k
Featured
See All Featured
Designing for Performance
lara
611
70k
Un-Boring Meetings
codingconduct
0
390
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
Statistics for Hackers
jakevdp
799
230k
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
360
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
We Are The Robots
honzajavorek
0
310
YesSQL, Process and Tooling at Scale
rocio
174
15k
Faster Mobile Websites
deanohume
310
32k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
57k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.5k
Transcript
Goの並行処理に入門しよう
自己紹介
- 官野 慎太朗 (かんの しんたろう) - 都内のIT事業会社にて勤務 - 手術支援ロボットPF開発 -
土木建機PF開発 - 技術経験 - 言語 - JavaScript/TypeScript - Go - DB - MySQL, PostgreSQL - コンテナ関係 - Docker - Kubernetes - クラウド技術 - AWS, Azure - その他 - Git, REST API, gRPC, Concourse, Flyway, etc… GitHub : @shinshin8 Medium : @doctorkanno572
Goを始めると出会う言葉たち Goroutine Channel Interface Struct ダックタイピング
アジェンダ 1. Goroutineって何? 2. Channelって何? 3. 終わりに
Goroutineって何?
Goroutineとは.... “A goroutine is a lightweight thread managed by the
Go runtime.” - A Tour of Go : Goroutine 邦訳:GoroutineとはGoのランタイムで管理される軽量のスレッド
とはいえ、パッとイメージが浮かばない。。。
package main import ( "log" "time" ) func say(s string)
{ for i := 0; i < 5; i++ { time.Sleep(1 * time.Second) log.Println(s) } } func main() { go say("world") say("hello") } package main import ( "fmt" "time" ) func say(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func main() { go say("world") say("hello") } 元のコード 手を加えたコード 出典:A Tour of Go : Goroutine
大体の処理の流れのイメージ $ go run main.go 2022/07/29 22:07:43 hello 2022/07/29 22:07:43
world 2022/07/29 22:07:44 hello 2022/07/29 22:07:44 world 2022/07/29 22:07:45 world 2022/07/29 22:07:45 hello 2022/07/29 22:07:46 hello 2022/07/29 22:07:46 world 2022/07/29 22:07:47 world 2022/07/29 22:07:47 hello
ちなみに・・・・ package main import ( "log" // "time" ★ コメントアウト
) func say(s string) { for i := 0; i < 5; i++ { // time.Sleep(1 * time.Second) ★ コメントアウト log.Println(s) } } func main() { go say("world") say("hello") } —---------------------------------------------------------- $ go run main.go 2022/07/29 22:35:31 hello 2022/07/29 22:35:31 hello 2022/07/29 22:35:31 hello 2022/07/29 22:35:31 hello 2022/07/29 22:35:31 hello
Channelって何?
Channelとは.... • Goroutine間での値のやりとりを可能にするパイプのようなもの。 • make(chan <扱いたい値の型>) でchannelを定義 • channel <-
で定義したchannelに値を代入 • <- channel で定義したchannelから値を取得
channelを使ったgoroutine間のやりとり func main() { flg := make(chan bool) ★bool型のchannelを定義 go
another(flg) time.Sleep(time.Second * 5) flg <- true ★ channelにtrueを代入 } func another(flg chan bool) { for { time.Sleep(time.Second * 2) select { case <-flg: ★channelがtrueの場合 log.Println("goroutine is done") return default: log.Println("goroutine is running") } } } $ go run main.go 2022/07/30 17:30:34 goroutine is running 2022/07/30 17:30:36 goroutine is running 2022/07/30 17:30:38 goroutine is done 実行結果
channelを使ったgoroutine間のやりとりのイメージ
終わりに
どういった場面で並行処理が使われるのか? • 処理実行のパフォーマンス改善 ◦ Syncパッケージを使った同期や排他制御 • Webフレームワーク、gRPCを使用する際の理解 ◦ contextを用いたgoroutineの扱い
楽しいGo Lifeを!! ご清聴ありがとうございました