Go で並列処理を書いてみた

今日はGo言語で並列処理を書いてみました。

キューに入れた値を、順次ワーカースレッドが処理するという簡単なものです。

package main

import (
    "fmt"
    "time"
    "sync"
)

func main() {
    //スレッドの終了待ちのためにWaitGroupを作成
    var wg sync.WaitGroup
    //関数の終了時に、各スレッドの終了を待つ
    defer wg.Wait()

    //チャンネルを作成(チャンネルバッファは20)
    queue := make(chan int, 20)
    //終わったらチャンネルを閉じる。
    //ちゃんと閉じてあげないと、各スレッドが終了せずデッドロックになる
    defer close(queue)

    //チャンネルに入れた値を処理するスレッドを作成
    wg.Add(10)
    for i := 0; i < 10; i++ {
        go func() {
            //関数の終了時に、wgに終了を知らせる
            defer wg.Done()
            fmt.Println("Thread start")
            for {
                //チャンネルから値を取り出す
                val, ok := <- queue
                //チャンネルが閉じられていたら終了
                if ! ok { break }
                //100ms sleep
                time.Sleep(100 * time.Millisecond)
                //適当に値を出力
                fmt.Println("Value is %d", val)
            }
            fmt.Println("Thread end")
        }()
    }

    //チャンネルに値を追加する。
    for i := 0; i<150; i++ { queue <- i * 10 }

    println("Main thread end")
}

defer(関数の終了時に処理をさせる)がすごく便利です。
覚えることも少ないし、すごく直感的でいいです。

コメント

タイトルとURLをコピーしました