Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Go言語 並行処理モデル 入門編

Go言語 並行処理モデル 入門編

2025/05/04 12:00-【Tech Talk Together #1】
https://rossam-tech.com/tech-blog/tech-talk-together%e9%96%8b%e5%82%ac%e3%81%ae%e3%81%8a%e7%9f%a5%e3%82%89%e3%81%9b

主催:ろっさむ|Rossam
登壇:"MIYA" 、おろ、Kuroringo、Tom

【テーマ】
Go言語 並行処理モデル 入門編
【概要】
Goで実現する非同期処理なステップを一緒にみてみよう。

【Sampleコード】
https://go.dev/play/p/VulPxN2Zp3X

※"MIYA"の当資料は個人の学習範囲のみでお使いください。

【AIによる補足audio】
https://notebooklm.google.com/notebook/e00233b2-cf13-4d27-9718-3d9ae94feca2/audio
【英字幕】
https://youtu.be/eFA5mj8C6wc?si=xUFH27XbfpQZqBJi

Avatar for @miya38eng

@miya38eng

May 02, 2025
Tweet

Other Decks in Programming

Transcript

  1. Go言語 並行処理モデル 入門編 作成日 : 2025/04/12 “MIYA”(非公開) X : @miya38eng

    更新日 :2025/04/30 フォーマットの参考 : 桜井政博「大乱闘スマッシュブラザーズ」企画書 Youtube オリジナル Goherくん(擬人化)
  2. Go言語 並行処理モデル 入門編  テーマ ▶概要    並行処理・並列処理    ゴール―チン  

     チャネル    Syncパッケージ    selectとdefault    Sampleコード Goには「非同期処理」という言葉が言語の公式な機能や キーワードとして明確に定義されているわけではないけど、 非同期っぽい動きを実現することはかなりできる! Goで実現する非同期処理なステップを一緒にみてみよう。
  3. Go言語 並行処理モデル 入門編  概要  テーマ   ▶並行処理・並列処理    ゴール―チン  

     チャネル    Syncパッケージ    selectとdefault    Sampleコード 「並行」処理のつもりで話していたのに、相手がそれを「並 列」と思っていた、またはその逆があってはとんでもないディ スコミニケーションとなります。
  4. Go言語 並行処理モデル 入門編  概要  テーマ    並行処理・並列処理   ▶ゴル―チン  

     チャネル    Syncパッケージ    selectとdefault    Sampleコード
  5. ゴルーチン( Goroutines):軽量な並行処理(スレッドみたいなもの) go 関数名(引数) func main() { // chan(チャネル)」という 型の

    変数(箱)(結果を受け取るポスト) reserveDone := make(chan string) emailDone := make(chan string) // ゴルーチンで「予約を保存」 go saveReservation("2025-04-09", "A-1", "[email protected]", reserveDone) // ゴルーチンで「メールを送信」 go sendEmail("[email protected]", "A-1 reserved!", emailDone)
  6. Go言語 並行処理モデル 入門編  概要  テーマ    並行処理・並列処理    ゴル―チン  

    ▶チャネル    Syncパッケージ    selectとdefault    Sampleコード
  7. チャネル( Channels):ゴルーチン同士が 通信するためのポスト(郵便受け) // 結果を受け取る reserveResult := <-reserveDone emailResult :=

    <-emailDone fmt.Println(reserveResult) fmt.Println(emailResult) // チャネルをクローズ close(reserveDone) close(emailDone) msg := <-ch // チャネルから受信 ch <- msg // チャネルへ送信 ※closeは、1回しか使わない場合閉じる必要なし! チャネルをforループで受け取るなど、複数の値を送るときは必須。
  8. Go言語 並行処理モデル 入門編  概要  テーマ    並行処理・並列処理    ゴル―チン  

     チャネル   ▶Syncパッケージ    selectとdefault    Sampleコード
  9. syncパッケージ:複数のゴルーチン( Goの軽量スレッド)の間でのデータリクエストや リソースの安全な共有を管理するための機能 sync.Mutex - ミューテックス  • 一人だけがデータを変更できるようにする仕組み • 使い始めるときに「Lock()」で鍵をかけて、終わったら「Unlock()」で開ける sync.WaitGroup

    - ウェイトグループ • 複数の作業(ゴルーチン)が全部終わるまで待つための仕組み • 「全員集まるまで次の場所に行かない」というルールのようなもの sync.RWMutex - アールダブリューミューテックス • 読むだけなら多くの人が同時にできるけど、書き換えるときは一人だけ • データをよく読む場合に便利 sync.Once - ワンス • プログラムの中で何度呼ばれても一度だけ実行される • 初期化処理などで使う
  10. Go言語 並行処理モデル 入門編  概要  テーマ    並行処理・並列処理    ゴル―チン  

     チャネル    Syncパッケージ   ▶selectとdefault    Sampleコード Go言語 並行処理モデル 入門編 switch文 select文 複数のチャネル操作 値変数 比較対象 特徴 default 用途 並行処理向け ×基本は通常の条件分岐 ✓チャネル操作の待機・非同期処理 どれも一致しないときの処理 どのチャネルも準備出来てないときの処理 ロジック分岐、値比較 チャネル監視、非同期処理、タイムアウト処理
  11. // 変数 color を定義し、 "green" という文字列を代入 color := "green" //

    color の値に応じて分岐処理を行う switch color { case "red": // color が "red" の場合 fmt.Println("赤です") // → "赤です" と表示 case "blue": // color が "blue" の場合 fmt.Println("青です") // → "青です" と表示 default: // どの case にも一致しない場合に実行される( ← これが default の働き) fmt.Println("その他の色です ") // → "その他の色です " と表示される } select { case msg := <-ch: // ch チャネルからメッセージを受信できた場合に実行される // msg にその値を代入し、出力する fmt.Println("メッセージを受信 :", msg) default: // ch チャネルに値が送られておらず、受信できない( =ブロックされる)場合、 // ここが実行される。 select 文はブロックせず、即時に default に進む。 fmt.Println("何も届いていません ") // チャネルが何も準備していないときに 実行 } selectとdefault:Go言語における default は、 switch 文または select文で使われる 「どの条件にも一致しないときに実行される処理」を定義するキーワードです。
  12. Go言語 並行処理モデル 入門編  概要  テーマ    並行処理・並列処理    ゴル―チン  

     チャネル    Syncパッケージ    selectとdefault    ▶Sampleコード
  13. The Go Playground 座席表で予約の保存ボタンを押下とメール送信を並行実行される非同期ぽい処理 Sample The Go Playground(ザ ゴー プレイグラウンド)は、Go言語のコードをコンパイル・実行できるウェブサービスです。

    golang.org のサーバで稼働しています。 別事例として、ECサイトの購入(決済時)ボタン押下すると完了メールが届く処理と類似した処理のイメージが想像できます。