美文网首页
golang 利用通道挂起 顺序执行 go

golang 利用通道挂起 顺序执行 go

作者: 蛐蛐儿阳 | 来源:发表于2020-05-05 13:08 被阅读0次

    直接上代码

    package main
    
    import (
        "fmt"
        "time"
    )
    
    func main()  {
        chan1 := make(chan bool)
        chan2 := make(chan bool)
    
        go func() {
            <- chan2
            for i := 0; i < 2; i++ {
                fmt.Println("1")
            }
            close(chan1)
        }()
    
        go func() {
            //<- chan1
            for i := 0; i < 2; i++ {
                fmt.Println("2")
            }
            close(chan2)
        }()
    
        go func() {
            <- chan1
            for i := 0; i < 2; i++ {
                fmt.Println("3")
            }
        }()
    
        time.Sleep(time.Second * 3)
    }
    

    这会输出什么?
    2-》1》3
    且不报错。最后的 time来结束有些丑陋,改下代码

    package main
    
    import (
        "fmt"
    )
    
    func main()  {
        chan1 := make(chan bool)
        chan2 := make(chan bool)
    
        closeEnd := make(chan bool)
        go func() {
            <- chan2
            for i := 0; i < 2; i++ {
                fmt.Println("1")
            }
            close(chan1)
        }()
    
        go func() {
            //<- chan1
            for i := 0; i < 2; i++ {
                fmt.Println("2")
            }
            close(chan2)
        }()
    
        go func() {
            <- chan1
            for i := 0; i < 2; i++ {
                fmt.Println("3")
            }
            closeEnd <- true
        }()
    
        <- closeEnd
        //time.Sleep(time.Second * 3)
    }
    

    其实都理解, <- 是等待接收通道信息, 相当于挂起等待。 当通道被关闭,他就不等了,返回通道类型默认空置, 也就是false。
    分析一波,是三个go 本应该同时进行,
    第二个头部什么都没有 ,开始输出for 信息, 输出完关闭chan2, chan2被关闭, 被挂起的chan2不在挂起,第一个go开始执行,同理执行完for,chan1被关闭,然后第三个go开始执行,执行完closeEnd 传值,在外关闭。

    相关文章

      网友评论

          本文标题:golang 利用通道挂起 顺序执行 go

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