Dav*_*vic 2 concurrency go channels
我遇到了一个奇怪的行为.我正在使用缓冲通道,当使用大缓冲区时,整个程序执行将会阻塞.在以下代码段中:
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")
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的程序在大约96000次迭代时阻止,并且永远不会达到"完全"打印,除非我len(choke)在评估它之前打印出来.这可能是由于提供的延迟fmt.Println,因为问题也可以通过添加一个小的"固定" time.Sleep.
有人可以解释这种行为的原因吗?
发生这种情况是因为你的goroutine永远不会执行.你在goroutine之外的"for"循环是一个没有任何阻塞操作的紧密循环,这意味着它获得了所有的调度程序时间.因此,您创建的goroutine永远不会被安排执行.
当你有print语句时它会起作用,因为这是一个阻塞操作(I/O),它导致Go调度程序切换到你创建的goroutine.