package main
import "fmt"
import "runtime"
import "time"
func check(id int) {
fmt.Println("Checked", id)
<-time.After(time.Duration(id)*time.Millisecond)
fmt.Println("Woke up", id)
}
func main() {
defer runtime.Goexit()
for i := 0; i <= 10; i++ {
fmt.Println("Called with", i)
go check(i)
}
fmt.Println("Done for")
}
私はGoが初めてなので、どんな指針も素晴らしいでしょう。そのようなことをデバッグするにはどうすればよいですか?
スニペットhttp://play.golang.org/p/SCr8TZXQUEを実行できます
更新:これ <-time.After(time.Duration(id)*time.Millisecond)
は遊び場の行がなくても機能します。理由を知りたいですか?(@dystroy で述べたように、これはおそらく遊び場が時間を処理する方法によるものです)
ローカルで試してみると、これが出力です。
Called with 0
Called with 1
Checked 0
Called with 2
Checked 1
Called with 3
Checked 2
Called with 4
Woke up 0
Checked 3
Called with 5
Checked 4
Called with 6
Checked 5
Called with 7
Checked 6
Called with 8
Checked 7
Called with 9
Checked 8
Called with 10
Checked 9
Woke up 1
Done for
Checked 10
Woke up 2
Woke up 3
Woke up 4
Woke up 5
Woke up 6
Woke up 7
Woke up 8
Woke up 9
Woke up 10
throw: all goroutines are asleep - deadlock!
goroutine 2 [syscall]:
created by runtime.main
/tmp/bindist046461602/go/src/pkg/runtime/proc.c:221
goroutine 5 [timer goroutine (idle)]:
created by addtimer
/tmp/bindist046461602/go/src/pkg/runtime/ztime_amd64.c:69
exit status 2
すべてのゴルーチンが完了しますが、とにかくデッドロックがスローされます。タイマーが使用されているかどうかは問題ではなく、どちらの方法でもデッドロックが発生することに注意してください。