Go 的并发模式(中)(更新中)

作者: zidea | 来源:发表于2019-04-03 07:48 被阅读1次
    • 有几种情况都会发生堵塞,一旦发生堵塞就会造成锁死

    • 第一种情况只有发送没有接受,就会造成 blocking

    ch := make(chan int)
        ch <- 1
    
    • 第二种情况没有发送只有接受,就会造成 blocking
    ch := make(chan int, 3)
    fmt.Println("",<-ch)
    
    • buffered channel 一旦满了也会造成 blocking 的问题
        ch := make(chan int, 3)
        ch <-1
        ch <-2
        ch <-3
        
    
        fmt.Println("",<-ch)
        fmt.Println("",<-ch)
        fmt.Println("",<-ch)
    
    
    • 可以用 close 来关闭 channel,但这并不是最好解决方案
        ch := make(chan int, 3)
        ch <-1
        ch <-2
        ch <-3
        
        close(ch)
        fmt.Println("",<-ch)
        fmt.Println("",<-ch)
        fmt.Println("",<-ch)
        fmt.Println("",<-ch)
        fmt.Println("",<-ch)
    
    

    大家发现当关闭channel后重,动态获取值为 0

     1
     2
     3
     0
     0
    

    当调用 close 来关闭通道后,我们再从 channel 获取数据时候返回两个值
    0 为 int类型默认值, false 表示该 channel 已经关闭。

    val, ok := <-ch
       fmt.Println("",ok)
       fmt.Println("",val)
    
    
        false
     0
    

    相关文章

      网友评论

        本文标题:Go 的并发模式(中)(更新中)

        本文链接:https://www.haomeiwen.com/subject/gfhgbqtx.html