import (
"fmt"
"time"
)
func consumer(cname string, ch chan int) {
//可以循环 for i := range ch 来不断从 channel 接收值,直到它被关闭。
for i := range ch {("consumer-----------", cname, ":", i)
}
("ch closed.")
}
func producer(pname string, ch chan int) {
for i := 0; i < 4; i++ {
("producer--", pname, ":", i)
ch <- i
}
}
func main() {
//用channel来传递"产品", 不再需要自己去加锁维护一个全局的阻塞队列
ch := make(chan int)
go producer("生产者1", ch)
go producer("生产者2", ch)
go consumer("消费者1", ch)
go consumer("消费者2", ch)
(10 * )
close(ch)
(10 * )
}
for i := range ch {
("consumer-----------", cname, ":", i)
}
这个也可以改成:LOOP:
for {
select {
case i,ok:=<-ch:
if ok {
("consumer--------", cname, ":", i)
} else {
break LOOP
}
}
}
//注意: i := <- ch 从空的channel中读取数据不会panic, i读取到的值是0, 如果channel是bool的,那么读取到的是false
//判断channel是否关闭,可以使用像上面的ok pattern
channel 本身就是并发安全的。
-