我遇到了奇怪的行为。我正在使用缓冲通道,并且当使用大缓冲区时,整个程序的执行都会阻塞。在以下代码段中:
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,因为也可以通过添加一个small来“解决”该问题time.Sleep。
len(choke)
fmt.Println
time.Sleep
有人可以解释这种现象的原因吗?
发生这种情况是因为您的goroutine从未执行过。goroutine之外的“ for”循环是一个紧密的循环,没有任何阻塞操作,这意味着它将获得所有调度程序时间。因此,您创建的goroutine从未计划执行。
当您拥有print语句时,它会起作用,因为这是一个阻塞操作(I / O),可导致Go计划程序切换到您创建的goroutine。