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 本身就是并发安全的。

 

posted on 2020-03-04 12:04  ExplorerMan  阅读(5086)  评论(0编辑  收藏  举报

导航