定义两个无缓冲的channel,同时用for进行遍历,前一个会阻塞后一个吗
是的
func Chan() {
c1 := make(chan int)
c2 := make(chan int)
go func() {
for i := 0; i < 5; i++ {
time.Sleep(2 * time.Second)
c1 <- i
}
close(c1)
}()
go func() {
for i := 0; i < 5; i++ {
time.Sleep(3 * time.Second)
c2 <- i
}
close(c2)
}()
for i := range c1 {
println("c1", i)
}
for i := range c2 {
println("c2", i)
}
}
执行结果
c1 0
c1 1
c1 2
c1 3
c1 4
c2 0
c2 1
c2 2
c2 3
c2 4
第二个for循环会等待第一个for循环执行完成之后才会执行第2个for循环,因为没有缓存,第二个协程的channel无法提前写入,需要等待有消耗的时候才能写入,最终耗时是22s
优化方式:
- 可以用两个协程来遍历,这样就不需要等待了,就是上边的代码range的时候用两个go func来实现
- 加上缓存,c1 := make(chan int,5)可以提升效率