如何获取无缓冲通道中的元素数量



我的程序处于死锁状态,我想调试它,并告诉它一个无缓冲通道中有多少元素,在Go中有什么方法可以做到这一点吗?下面的代码并没有像我预期的那样输出2(它进一步死锁,这也是我找不到的原因)

package main
import "fmt"
func main() {
channel := make(chan string)
done_channel := make(chan bool)
go func() {
channel <- "value"
channel <- "value"
fmt.Println(len(channel))
done_channel <- true
}()
variable := <- channel
fmt.Println(variable)
ok := <- done_channel
fmt.Println(ok)
}

Go运行时有一个您刚刚遇到的死锁检测器。探测器正在为您提供解决问题所需的所有信息。您不需要分析通道长度。

让我们看看你的程序的输出

value
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
/home/grzesiek/test.go:16 +0x17e
goroutine 5 [chan send]:
main.main.func1(0xc42001a0c0, 0xc42001a120)
/home/grzesiek/test.go:10 +0x99
created by main.main
/home/grzesiek/test.go:13 +0x9c
exit status 2

据说所有的goroutines都处于休眠状态(被阻止),不可能有任何进展。阻塞的goroutines与阻塞操作和导致阻塞的行一起列出。

Goroutine 1(main)正在尝试从第16行的通道done_channel中读取。

Goroutine 5(由函数调用运算符()在第13行创建)正试图写入第10行中的通道channel。它永远不会走得更远,因为在通道的另一边没有goroutine。因此,它永远不会写入done_channel

程序被阻止,因为没有goroutine可以继续,主goroutine也被阻止。

请注意,Go程序在主goroutine结束时结束,因此如果您不尝试从done_channel读取,则不会发生死锁。

最新更新