0
1

More than 3 years have passed since last update.

【Golang】ゴルーチン⑤複数goroutinからチャネルに値を入れ取り出す

Posted at

【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")
}
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1