猿问

Golang 超时不与通道一起执行

我正在使用 goroutines/channels。这是我的代码。为什么超时情况没有得到执行?


func main() {

    c1 := make(chan int, 1)


    go func() {

        for {

            time.Sleep(1500 * time.Millisecond)

            c1 <- 10

        }

    }()


    go func() {

        for {

            select {

            case i := <-c1:

                fmt.Println(i)

            case <-time.After(2000 * time.Millisecond):

                fmt.Println("TIMEOUT") // <-- Not Executed

            }

        }

    }()


    fmt.Scanln()

}


一只甜甜圈
浏览 143回答 1
1回答

慕的地6264312

您的超时不会发生,因为您的一个 goroutinec1每隔 1.5 秒(左右)在您的频道上重复发送一个值,并且只有c1在 2 秒内没有收到任何值时才会发生超时。一旦从 接收到一个值c1,在下一次迭代中select再次执行一个新的 time.After()调用,它将返回一个新的通道,该通道上的值将仅在 2 秒后发送。上次select执行的超时通道被丢弃,不再使用。要在 2 秒后接收超时,只需创建一次超时通道,例如:timeout := time.After(2000 * time.Millisecond)for {&nbsp; &nbsp; select {&nbsp; &nbsp; case i := <-c1:&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(i)&nbsp; &nbsp; case <-timeout:&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("TIMEOUT") // Will get executed after 2 sec&nbsp; &nbsp; }}输出:10TIMEOUT101010...
随时随地看视频慕课网APP

相关分类

Go
我要回答