LoginSignup
7
7

More than 3 years have passed since last update.

go初心者がgoroutineとChannelを使ってみる

Last updated at Posted at 2014-08-27

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
7
7
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
7
7