go select语句中发送和接收操作之间的优先级规则

go select 语句中发送和接收操作之间是否有优先级规则?


由于“发送”操作始终准备就绪,不像“接收”操作等待来自通道的某些内容,我总感觉“发送”将首先在选择上执行。


我尝试了一些代码来测试发送和接收都准备好时会发生什么:


package main


import (

    "fmt"

    "time"

)


func main() {

    ch1 := make(chan string)

    ch2 := make(chan string)

    go goOne(ch1)

    go goTwo(ch2)


    time.Sleep(time.Second * 2)

    select {

    case ch2 <- "To goTwo goroutine":

    case msg1 := <-ch1:

        fmt.Println(msg1)

    }

}


func goOne(ch chan string) {

    ch <- "From goOne goroutine"

}


func goTwo(ch chan string) {

    msg := <-ch

    fmt.Println(msg)

}

结果似乎总是“来自 goOne goroutine”。所以看起来接收操作具有优先级。但这是设计效果吗?还是会发生先执行发送的情况?我在文档中找不到信息


如果我希望接收操作具有优先权,我可以依赖它还是应该做其他事情?


慕的地8271018
浏览 147回答 1
1回答

侃侃无极

go select 语句中发送和接收操作之间是否有优先级规则?不可以。当case同时准备好一个以上时,随机执行一个。因为“发送”操作总是准备好的不对。当另一侧没有接收任何内容或缓冲通道的缓冲区已满时,发送操作可能只是阻塞(即未准备好)。还是会发生先执行发送的情况?Yes, but you may see no output when this case is selected because your program resumes execution in main and exits immediately before the goTwogoroutine can actually print anything.如果我希望接收操作具有优先级 [...]select 语句的语义是:“执行先准备好的”。如果一种情况必须优先于另一种情况,请将另一种情况更改为default(如果没有其他准备就绪则运行):&nbsp; &nbsp; select {&nbsp; &nbsp; case msg1 := <-ch1:&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(msg1)&nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; ch2 <- "To goTwo goroutine"&nbsp; &nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go