美文网首页golang成长记
golang channel 堵塞

golang channel 堵塞

作者: Tim_SSS | 来源:发表于2018-11-13 14:26 被阅读0次

    情况1、同一个协程中,没有关闭通道( no close(chan))

    package main
    import "fmt"
    func main()  {
        ch := make(chan int,3)
    
        for i:=1; i <= 3; i++ {
            ch <- i
        }
    
        for data := range ch {
            fmt.Println("echo data :",data)
        }
    }
    
    小结

    同步操作
    当在一个协程里面,进行通信的话,其实就是同步操作。(这里通信是指的通过channel进行读取和写入操作,前面代码写入通道,后面代码读取操作)
    在用for range (或者其他大于通道长度的循环次数),会出现死锁 chan receive deadlock

    情况2、同一个协程中,关闭通道(close(chan))

    package main
    import "fmt"
    func main()  {
        ch := make(chan int, 3)
        for i := 1; i <= 3; i++ {
            ch <- i
        }
        close(ch)
        for data := range ch {
            fmt.Println("echo data :",data)
        }
        fmt.Println("不堵塞验证")
    }
    
    小结

    当循环读取数据时,读取遇到关闭通道,会跳出for range 循环。

    情况3、协程之间(协程)通信,会出现堵塞

    package main
    import (
        "fmt"
        "time"
    )
    func main()  {
        ch := make(chan int,3)
        for i:=1; i <= 3; i++ {
            ch <- i
        }
        go func() {
            for data := range ch {
                fmt.Println("echo data :",data)
            }
                    fmt.Println("堵塞在这里") //永远输出不来
        }()
    
        time.Sleep(time.Second) // 用于调试,防止子协程还没有执行,就直接退出。
    }
    
    小结

    会出现堵塞,子协程会一直堵塞,直到接收到关闭channel的时候。

    相关文章

      网友评论

        本文标题:golang channel 堵塞

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