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个打印
该代码示例展示了如何在Go中利用带缓冲的通道(pool)限制并发执行的goroutine数量。当池满时,新的goroutine会阻塞直到池中有空闲位置。每个goroutine执行完任务后通过defer释放池中的一个结构体,保证了并发量的最大值为5,且每2秒输出5次‘doing...’。
502

被折叠的 条评论
为什么被折叠?



