今日は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(関数の終了時に処理をさせる)がすごく便利です。
覚えることも少ないし、すごく直感的でいいです。
コメント