go无缓冲通道,两个通道阻塞行为不一致的疑问

发布时间 2023-12-15 07:23:12作者: 鱼歌

先贴代码

代码1

func main() {
    fmt.Println("---start chantest3")
    chanA := make(chan int)
    chanC := make(chan string)
    
    go chanHandleA(chanA)
    fmt.Println("---before chanHandleA<-testVal", time.Now())
    testVal := 3
    chanA <- testVal
    fmt.Println("---after chanHandleA<-testVal", time.Now())

    fmt.Println("")
    
    go chanHandleC(chanC)
    fmt.Println("---before chanHandleC<-testVal2", time.Now())
    testVal2 := "55"
    chanC <- testVal2
    fmt.Println("---after chanHandleC<-testVal2", time.Now())
}
func chanHandleA(c chan int) {
    fmt.Println("[chanHandleA] reading", time.Now())
    num := <-c
    fmt.Println("[chanHandleA] read2", time.Now())
    c <- num * num
}
func chanHandleC(c chan string) {
    fmt.Println("[chanHandleC] reading", time.Now())
    str := <-c
    fmt.Println("[chanHandleC] read2", time.Now())
    c <- str + "a"
}

执行结果1

---start chantest3
---before chanHandleA<-testVal 2023-12-13 22:18:07.8027533 +0800 CST m=+0.002027001
[chanHandleA] reading 2023-12-13 22:18:07.8027533 +0800 CST m=+0.002027001
[chanHandleA] read2 2023-12-13 22:18:07.8117575 +0800 CST m=+0.011031201
---after chanHandleA<-testVal 2023-12-13 22:18:07.8117575 +0800 CST m=+0.011031201

---before chanHandleC<-testVal2 2023-12-13 22:18:07.8117575 +0800 CST m=+0.011031201
[chanHandleC] reading 2023-12-13 22:18:07.8117575 +0800 CST m=+0.011031201
[chanHandleC] read2 2023-12-13 22:18:07.8117575 +0800 CST m=+0.011031201
---after chanHandleC<-testVal2 2023-12-13 22:18:07.8117575 +0800 CST m=+0.011031201

 

代码2(只是将 go chanHandleC(chanC) 紧随 go chanHandleA(chanA) 后面)

func main() {
    fmt.Println("---start chantest3")
    chanA := make(chan int)
    chanC := make(chan string)
    
    go chanHandleA(chanA)
    go chanHandleC(chanC)
    fmt.Println("---before chanHandleA<-testVal", time.Now())
    testVal := 3
    chanA <- testVal
    fmt.Println("---after chanHandleA<-testVal", time.Now())

    fmt.Println("")
    
    fmt.Println("---before chanHandleC<-testVal2", time.Now())
    testVal2 := "55"
    chanC <- testVal2
    fmt.Println("---after chanHandleC<-testVal2", time.Now())
}
func chanHandleA(c chan int) {
    fmt.Println("[chanHandleA] reading", time.Now())
    num := <-c
    fmt.Println("[chanHandleA] read2", time.Now())
    c <- num * num
}
func chanHandleC(c chan string) {
    fmt.Println("[chanHandleC] reading", time.Now())
    str := <-c
    fmt.Println("[chanHandleC] read2", time.Now())
    c <- str + "a"
}

执行结果2

---start chantest3
---before chanHandleA<-testVal 2023-12-13 22:09:24.8118001 +0800 CST m=+0.002073501
[chanHandleA] reading 2023-12-13118001 +0800 CST m=+0.002073501
[chanHandleA] read2 2023-12-13 22:09:24.8200821 +0800 CST m=+0.010355501 22:09:24.8
---after chanHandleA<-testVal 2023-12-13 22:09:24.8200821 +0800 CST m=+0.010355501

---before chanHandleC<-testVal2 2023-12-13 22:09:24.8200821 +0800 CST m=+0.010355501
[chanHandleC] reading 2023-12-13 22:09:24.8200821 +0800 CST m=+0.010355501
[chanHandleC] read2 2023-12-13 22:09:24.8200821 +0800 CST m=+0.010355501
---after chanHandleC<-testVal2 2023-12-13 22:09:24.8200821 +0800 CST m=+0.010355501

num := <-c 和 str := <-c 执行后,后面的代码都会被阻塞。

为什么代码1中[chanHandleA] read2和[chanHandleC] read2还能输出?

代码2 [chanHandleA] read2能输出而[chanHandleC] read2不能输出?