package main
import (
"fmt"
"time"
)
func main() {
p := producer()
for c := range p {
fmt.Println(c)
}
}
func producer() <-chan string {
ch := make(chan string)
go func() {
for i := 0; i < 5; i++ {
ch <- fmt.Sprint("hello", i)
time.Sleep(1 * time.Second)
}
// commented the below to show the issue
// close(ch)
}()
return ch
}
上記のコードを実行すると5つのメッセージが表示され、「すべてのgoルーチンはスリープデッドロックエラーです」というメッセージが表示されます。チャンネルを閉じるとエラーが消えてしまうことが分かります。goチャネルデッドロック
私が理解したいことは、コードがチャネル上で無限に待機し、チャネルにデータを送信する何もないことをランタイムがどのように認識するのかということです。
main()関数に追加のgoルーチンを追加すると、エラーは発生せず、チャネルで待機し続けます。
go func() {
for {
time.Sleep(2 * time.Millisecond)
}
}()
だから、これは行くランタイムがちょうど潜在的にチャネルにデータを送信するので、デッドロックエラーを投げることができませんでしたランニングゴールーチンの存在を探しています。..意味するのでしょうか?
おかげ@Eddy R :-)テレビで1を再生し、囲碁コア開発者ではありませんよ。 +1を与えようとしましたが、私の低い点のためにシステムが許可しませんでした。 – tblogger