#【Golang】ゴルーチン⑤複数goroutinからチャネルに値を入れ取り出す
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。
package main
//producerとconsumer
//複数goroutinからチャネルに値を入れ取り出す
//mainから、いくつかのProducerを走らせて、
//その処理結果をchannelに入れて、Consumerでchanelの値を集めれて
//処理を行う
import (
"fmt"
"sync"
"time"
)
func producer(ch chan int, i int) {
ch <- i * 5
}
func consumer(ch chan int, wg *sync.WaitGroup) {
for i := range ch {
//インナー無名関数
//処理をまとめたいとき。
func() {
defer wg.Done()
fmt.Println("process", i*100)
}() //() 実行
}
fmt.Println("全producer受け取り終了")
}
func main() {
//並列処理 全てのGoroutinが終わるまで待つ
var wg sync.WaitGroup
//channelを作成
ch := make(chan int)
// Producer
//10回分作成
for i := 0; i < 10; i++ {
//Consumerが全て受け取ったかを確認するため
//10回追加
wg.Add(1)
go producer(ch, i)
}
// Consumer
//同じwg なのでアドレスで渡す
go consumer(ch, &wg)
wg.Wait()
//ここでクローズするのは、まだconsumerのgoroutinが走っている為
//consumerだけ走ったまま終了してしまう
//Consumer内のchannelが全て出力されるのを待つ
close(ch)
//Consumerが全て終わったら
time.Sleep(2 * time.Second)
fmt.Println("Done")
}