channel
Go 言語で goroutine 間のデータ通信と同期を行う型付きパイプ
channel とは
channel は Go 言語の組み込み型で、goroutine 間でデータを安全に送受信する型付きパイプである。共有メモリではなく、メッセージパッシングで goroutine 間の通信を行う。Go の並行処理の哲学「メモリを共有して通信するな、通信してメモリを共有せよ」を体現する。
基本的な使い方
基本的な使い方のコード例を示す。
// チャネルの作成
ch := make(chan string)
// goroutine で送信
go func() {
ch <- "Hello" // 送信 (受信されるまでブロック)
}()
// メインで受信
msg := <-ch // 受信 (送信されるまでブロック)
fmt.Println(msg) // "Hello"
バッファなし vs バッファ付き
バッファなしと バッファ付き のコード例を比較する。
// バッファなし (同期): 送信と受信が同時に行われる
ch := make(chan int)
// 送信側は受信側が準備できるまでブロック
// バッファ付き (非同期): バッファが満杯になるまで送信がブロックしない
ch := make(chan int, 10)
// 10 個までバッファに溜められる
| 種類 | 動作 | 用途 |
|---|---|---|
| バッファなし | 送受信が同期 | goroutine 間の同期ポイント |
| バッファ付き | バッファが満杯になるまで非同期 | プロデューサー/コンシューマー |
select 文
複数のチャネルを同時に待ち受ける。最初に準備できたチャネルの操作を実行する。
select {
case msg := <-msgCh:
fmt.Println("Message:", msg)
case err := <-errCh:
fmt.Println("Error:", err)
case <-time.After(5 * time.Second):
fmt.Println("Timeout")
}
select は Go の並行処理で最も強力な構文だ。タイムアウト、キャンセル、複数ソースからの受信を簡潔に記述できる。
チャネルの方向
チャネルの方向のコード例を示す。
func producer(out chan<- int) { out <- 42 } // 送信専用
func consumer(in <-chan int) { v := <-in } // 受信専用
チャネルの方向を制限することで、誤った操作をコンパイル時に防ぐ。
チャネルのクローズ
チャネルのクローズのコード例を示す。
close(ch) // チャネルを閉じる (これ以上送信しない)
// range でチャネルが閉じるまで受信
for msg := range ch {
fmt.Println(msg)
}
TypeScript の類似概念
TypeScript には channel がないが、AsyncGenerator や ReadableStream が類似の概念を提供する。
Go の並行処理パターン比較
Go の並行処理パターン比較を以下にまとめる。
| パターン | 説明 | 用途 |
|---|---|---|
| チャネル | ゴルーチン間のメッセージパッシング | データの受け渡し |
| sync.Mutex | 排他制御 | 共有メモリの保護 |
| sync.WaitGroup | ゴルーチンの完了待ち | 並列処理の同期 |
| select | 複数チャネルの待ち受け | タイムアウト、多重化 |
| context | キャンセル、タイムアウト | リクエストのライフサイクル |
さらに掘り下げるなら関連書籍が参考になる。
この記事は役に立ちましたか?
関連用語
Go
Google が開発したシンプルで高速なコンパイル言語で、goroutine による軽量な並行処理が特徴
並行処理
複数のタスクを論理的に同時に進行させるプログラミング手法で、システムのスループットと応答性を向上させる
goroutine
Go の軽量スレッドで、数百万の並行処理を低コストで実現する
ファンアウト
1 つのイベントを複数のコンシューマーに同時配信するメッセージングパターン
メッセージキュー
プロデューサーとコンシューマーを非同期に接続し、メッセージを一時的に保持する通信基盤
gRPC
Google が開発した高性能な RPC フレームワークで、Protocol Buffers を用いた効率的なサービス間通信を実現する
関連する記事
有名プログラマの読書習慣 - 天才たちは何を読んできたのか
リーナス・トーバルズ、まつもとゆきひろ、ビル・ゲイツなど、著名なプログラマたちの読書習慣と愛読書を紹介します。天才たちの読書スタイルから学べることとは。
通勤電車で技術書を読む人が密かにやっていること
通勤時間を技術書の読書に充てている人たちの具体的な工夫を紹介します。限られた時間と環境で最大の学習効果を得るための実践テクニック。
あの有名 OSS のコードは、この本の影響を受けている
広く使われているオープンソースソフトウェアの設計には、特定の技術書の影響が色濃く反映されています。OSS のコードと技術書の関係を知ると、両方の理解が深まります。