zoukankan      html  css  js  c++  java
  • 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 本身就是并发安全的。
  • 相关阅读:
    Python 类和对象
    Python zxing 库解析(条形码二维码识别)
    MFC&Halcon之实时视频监控
    MFC&Halcon之图片显示
    Halcon11与VS2010联合开发
    堆排序程序中的小于等于号问题
    cenos7 u disk install
    UML类图关系表示
    socket http1
    mfc http
  • 原文地址:https://www.cnblogs.com/ExMan/p/12408655.html
Copyright © 2011-2022 走看看