码迷,mamicode.com
首页 > 其他好文 > 详细

golang channel多生产者和多消费者实例

时间:2020-03-04 12:56:55      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:select   lse   print   ann   range   ++   加锁   imp   全局   

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多生产者和多消费者实例

标签:select   lse   print   ann   range   ++   加锁   imp   全局   

原文地址:https://www.cnblogs.com/ExMan/p/12408655.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!