Goで複雑なシステムを構築する場合のSelectチャネルの使用 Go並行プログラミング

Go言語では、goroutineとchannelを利用することで並行処理を実現しています。goroutineはGo言語独自の軽量なスレッドで、複数のgoroutineを同時に実行することができます。一方で、channelは、goroutine間で通信を行うパイプです。

複雑なシステムを構築するときは、select文とchannelを使用して複数のgoroutine間で協調動作と同期を実現できます。

select文は、複数のチャネルの操作を同時に待ち、いずれかのチャネルの操作が準備が整い次第、対応するcase文を実行します。この文を用いることで、非ブロッキングなチャネル操作が実現し、特定のチャネルでブロックが生じてプログラム全体の進行が止まってしまう問題を回避できます。

以下の例は、selectとchannelを使用して複雑なシステムをどのように構築できるかを示しています。

package main
import (
"fmt"
"time"
)
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Println("worker", id, "started job", j)
time.Sleep(time.Second)
fmt.Println("worker", id, "finished job", j)
results <- j * 2
}
}
func main() {
jobs := make(chan int, 100)
results := make(chan int, 100)
// 启动3个goroutine来处理任务
for w := 1; w <= 3; w++ {
go worker(w, jobs, results)
}
// 发送5个任务到jobs channel
for j := 1; j <= 5; j++ {
jobs <- j
}
close(jobs)
// 获取所有结果
for a := 1; a <= 5; a++ {
<-results
}
}

上記の例では、タスクを処理するために3つのgoroutineを立ち上げています. まず、タスクの受け取り用と結果の受け取り用それぞれに1つずつ、2つのチャンネルを作成しています. main 関数内で、5つのタスクを jobs チャンネルに順番に送信し、そのチャンネルを閉じます. その後、別のループで results チャンネルから結果を受け取ります.

ワーカー関数では、for range ループを使用して jobs チャネルからタスクを受け取っています。jobs チャネルが閉じられたら、for range ループは自動的に終了します。各タスクを処理する間に、関連情報をプリントし、結果は results チャネルに送り返しています。

goroutine、チャネル、select文を用いることで、複数goroutine間の連携・同期を行い、複雑なシステムを構築可能です。

bannerAds