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多生产者和多消费者实例的主要内容,如果未能解决你的问题,请参考以下文章

具有单队列的 Rabbit MQ 中的多生产者、多消费者

用生产者消费者理解golang channel

golang 的 channel 实现 生产者/消费者 模型

[golang]单向channel的应用“生产消费者模型”

Go语言编程:使用条件变量Cond和channel通道实现多个生产者和消费者模型

多生产者-多消费者问题