goroutineとは
要はgoでサポートされているマルチスレッドの機構みたいなもの?
http://go-tour-jp.appspot.com/#63 より
goroutine (ゴルーチン)は、Goのランタイムに管理される軽量なスレッドです。
go f(x, y, z)
と書けば、 f は新しいgoroutine上で実行されます。
Channelとは
これを使えばプロデューサーコンシューマパターン的なものが書けそう
http://go-tour-jp.appspot.com/#64 より
チャネル( Channel )は、チャネルオペレータの <- を用いて値の送受信ができる直通ルートの型です。
ch <- v // v をチャネル ch へ送る。
v := <-ch // ch から受信し、
// 変数を v へ割り当てる。
(データは、矢印の方向に流れます。)マップとスライスのように、チャネルは使う前に以下のように生成する必要があります:
ch := make(chan int)
デフォルトでは、片方が準備できるまで送受信はブロックされます。 これは、明確なロックや条件変数がなくても、goroutineの同期を許します。
書いてみた
package main
import (
"fmt"
"time"
)
func putChannel(c chan int, count int) {
for i := 0; i < count; i++ {
c <- i
fmt.Printf("add %d...\n", i)
time.Sleep(100 * time.Millisecond)
}
close(c)
}
func main() {
c := make(chan int, 5)
go putChannel(c, 10)
time.Sleep(600 * time.Millisecond)
for i := range c {
fmt.Println(i)
}
}
結果
channelのバッファサイズは5なので5までの追加が先に行われ
その後はchannelからデータを取り出す->入れるが繰り返される
add 0...
add 1...
add 2...
add 3...
add 4...
0
1
2
3
4
add 5...
5
add 6...
6
add 7...
7
add 8...
8
add 9...
9