DRYな備忘録

Don't Repeat Yourself.

Go言語のgoroutineって一体何よ【golang】

goroutineって一体何よ

 さっぱり分からないよ。並行処理?んご。Pythonならthreadingをちょっとだけ使ったことある。

しらべてみよう

 これめっちゃ分かりよかったです

やってみよう

確かめたいポイントとしては

  • goroutineが並行して走ってること
  • mainが終わるとmain内で定義したgoroutineも死ぬこと
package main

import (
    "fmt"
    "time"
)

func repeat(say string, count int) {
    for i :=0; i<count; i++ {
        time.Sleep(1 * time.Second)
        fmt.Println(say, fmt.Sprintf("%d回目", i))
    }
}
func main() {
    go repeat("平沢\t", 2)// 2秒かかるgoroutineをつくった
    go repeat("秋山\t", 5)// 5秒かかるgoroutineをつくった
    go repeat("琴吹\t", 3)// 3秒かかるgoroutineをつくった
    repeat("田井中\t", 6)// 'main'というgoroutineが終わるのに6秒かかる
}

けっか

[21:41:49] → go run sample.go
田井中   0回目
平沢     0回目
秋山     0回目
琴吹     0回目
田井中   1回目
平沢     1回目
秋山     1回目
琴吹     1回目
田井中   2回目
秋山     2回目
琴吹     2回目
田井中   3回目
秋山     3回目
田井中   4回目
秋山     4回目
田井中   5回目

天使にふれたよ!

じゃ次に、mainを早々に終わらせてみる

[21:48:56] → diff -u sample.origin.go sample.go                                                                                                                                                          ~
--- sample.origin.go    2014-01-17 21:47:11.000000000 +0900
+++ sample.go   2014-01-17 21:48:43.000000000 +0900
@@ -13,7 +13,7 @@
 }
 func main() {
     go repeat("平沢\t", 2)// これは2秒かかるgoroutine
+    repeat("田井中\t", 4)// 'main'というgoroutineが終わるのに4秒かかる
     go repeat("秋山\t", 5)// これは5秒かかるgoroutine
     go repeat("琴吹\t", 3)// これは3秒かかるgoroutine
-    repeat("田井中\t", 6)// 'main'というgoroutineが終わるのに6秒かかる
 }

これでたぶん、平沢は1回目、琴吹は2回目、秋山は3回目で、田井中3回目でmainが終わるはず

結果

[21:49:07] → go run sample.go                                                                                                                                                                            ~
田井中   0回目
平沢     0回目
田井中   1回目
平沢     1回目
田井中   2回目
田井中   3回目

ふわふわタイム!Σ(゚д゚lll)

  • 琴吹、秋山は1回も実行されていない

まあ当たり前か、mainで実行しているrepeat("田井中\t", 4)が終わってないのだから、goroutine生成は待たされ、repeat("田井中\t", 4)が終わり秋山と琴吹のgoroutineが生成されたら、その途端mainが終わってしまい、結局秋山も琴吹も日の目を見ない。

なるほどなるほど。

だんだんと慣れていけばよさそう。

DRYな備忘録

f:id:otiai10:20140117215653j:plain