我遇到了奇怪的行为。我一直在使用缓冲 channel ,并且当使用大缓冲区时,整个程序的执行都会阻塞。在以下代码段中:
package main
import (
"fmt"
)
func main() {
choke := make(chan string, 150000)
go func() {
for i := 0; i < 10000000; i++ {
choke <- string(i)
fmt.Println("i=", i)
}
}()
for {
//fmt.Println(len(choke))
if len(choke) >= 150000 {
fmt.Println("Full")
}
}
}
我的程序在〜96000次迭代时阻塞,并且永远不会达到“完全”打印,除非在评估之前打印出
len(choke)
。这可能是由于fmt.Println
提供的延迟所致,因为还可以通过添加一个小的time.Sleep
来“解决”该问题。有人可以解释这种现象的原因吗?
最佳答案
发生这种情况是因为您的goroutine从未执行过。 goroutine之外的“for”循环是一个紧密的循环,没有任何阻塞操作,这意味着它将获得所有调度程序时间。因此,您创建的goroutine从未计划执行。
当您拥有print语句时,它会起作用,因为这是一个阻塞操作(I/O),可导致Go计划程序切换到您创建的goroutine。
关于go - 获取大量的大型缓冲 channel 块进行循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48791949/