[勉強ノート] go 並列処理3 チャネルについて

チャネルについて

チャネルはGoの同期処理のプリミティブの1つ。送信専用、受信専用もある。

双方向チャネルは必要に応じて暗黙的に一方向チャネルに変換することも可能

var receiveChan <-chan interface{}
var sendChan chan<- interface{}
var c := make(chan interface{})

receiveChan = c
sendChan = c

close関数

関数内でチャネルがもう送られてこないことを知らせる。

c := make(chan int)

go func() {
    defer close(c)

    for i := 1; i <= 5; i++ {
        c <- i
    }
}()

for integer := range c {
    fmt.Printf("%v", integer)
}

 

複数のゴルーチンを一度に解放する例

begin := make(chan interface{})

var wg sync.WaitGroup

for i := 0; i < 4; i++ {
    wg.Add(1)

    go func(i int) {
        defer wg.Done()
        <-begin
        fmt.Printf("%v has begun\n", i)
    }(i)
}

fmt.Println("Unblocking goroutines...")
close(begin)
wg.Wait()

select文

チャネルをまとめるのに使う

c1 := make(chan interface{})
close(c1)
c2 := make(chan interface{})
close(c2)

var c1Count, c2Count int

for i := 1000; i >= 0; i-- {
    select {
    case <-c1:
        c1Count++
    case <-c2:
        c2Count++
    }
}

fmt.Printf("c1Count: %d\nc2Count: %d\n", c1Count, c2Count)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です