$30 off During Our Annual Pro Sale. View Details »

Goの並行処理に入門しよう

 Goの並行処理に入門しよう

Shintaro Kanno

July 30, 2022
Tweet

More Decks by Shintaro Kanno

Other Decks in Programming

Transcript

  1. Goの並行処理に入門しよう

    View Slide

  2. 自己紹介

    View Slide

  3. - 官野 慎太朗 (かんの しんたろう)
    - 都内のIT事業会社にて勤務
    - 手術支援ロボットPF開発
    - 土木建機PF開発
    - 技術経験
    - 言語
    - JavaScript/TypeScript
    - Go
    - DB
    - MySQL, PostgreSQL
    - コンテナ関係
    - Docker
    - Kubernetes
    - クラウド技術
    - AWS, Azure
    - その他
    - Git, REST API, gRPC, Concourse, Flyway,
    etc…
    GitHub : @shinshin8
    Medium : @doctorkanno572

    View Slide

  4. Goを始めると出会う言葉たち
    Goroutine Channel
    Interface
    Struct
    ダックタイピング

    View Slide

  5. アジェンダ
    1. Goroutineって何?
    2. Channelって何?
    3. 終わりに

    View Slide

  6. Goroutineって何?

    View Slide

  7. Goroutineとは....
    “A goroutine is a lightweight thread managed by the Go runtime.”
    - A Tour of Go : Goroutine
    邦訳:GoroutineとはGoのランタイムで管理される軽量のスレッド

    View Slide

  8. とはいえ、パッとイメージが浮かばない。。。

    View Slide

  9. 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

    View Slide

  10. 大体の処理の流れのイメージ
    $ 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

    View Slide

  11. ちなみに・・・・
    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

    View Slide

  12. Channelって何?

    View Slide

  13. Channelとは....
    ● Goroutine間での値のやりとりを可能にするパイプのようなもの。
    ● make(chan <扱いたい値の型>) でchannelを定義
    ● channel <- で定義したchannelに値を代入
    ● <- channel で定義したchannelから値を取得

    View Slide

  14. 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
    実行結果

    View Slide

  15. channelを使ったgoroutine間のやりとりのイメージ

    View Slide

  16. 終わりに

    View Slide

  17. どういった場面で並行処理が使われるのか?
    ● 処理実行のパフォーマンス改善
    ○ Syncパッケージを使った同期や排他制御
    ● Webフレームワーク、gRPCを使用する際の理解
    ○ contextを用いたgoroutineの扱い

    View Slide

  18. 楽しいGo Lifeを!!
    ご清聴ありがとうございました

    View Slide