max := 5
pool := make(chan struct{}, max)
for {
go func(){
pool <- struct{}{}
defer func(){<- pool}()
fmt.Println("doing...", time.Now().Format("05"))
time.Sleep(time.Second*2)
}()
}
# 输出
doing... 47
doing... 47
doing... 47
doing... 47
doing... 47
doing... 49
doing... 49
doing... 49
doing... 49
doing... 49
doing... 51
doing... 51
doing... 51
doing... 51
doing... 51
当 pool 满了的时候,pool <- struct{}{} 会阻塞,等待其他goroutine的defer中释放一个位置,所以示例中输出是每2秒输出5个打印