golang channel多生产者和多消费者实例
Posted exman
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang channel多生产者和多消费者实例相关的知识,希望对你有一定的参考价值。
package main import ( "fmt" "time" ) func consumer(cname string, ch chan int) { //可以循环 for i := range ch 来不断从 channel 接收值,直到它被关闭。 for i := range ch { fmt.Println("consumer-----------", cname, ":", i) } fmt.Println("ch closed.") } func producer(pname string, ch chan int) { for i := 0; i < 4; i++ { fmt.Println("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) time.Sleep(10 * time.Second) close(ch) time.Sleep(10 * time.Second) } for i := range ch { fmt.Println("consumer-----------", cname, ":", i) } 这个也可以改成:LOOP: for { select { case i,ok:=<-ch: if ok { fmt.Println("consumer--------", cname, ":", i) } else { break LOOP } } } //注意: i := <- ch 从空的channel中读取数据不会panic, i读取到的值是0, 如果channel是bool的,那么读取到的是false //判断channel是否关闭,可以使用像上面的ok pattern channel 本身就是并发安全的。
以上是关于golang channel多生产者和多消费者实例的主要内容,如果未能解决你的问题,请参考以下文章
golang 的 channel 实现 生产者/消费者 模型