猿问

随着时间超时。After 的行为不像用自动收报机或计时器超时

我希望以下功能的行为方式相同


func fillChanTimeoutUsingTicker(maxDuration time.Duration, chanSize int) chan string {

    c := make(chan string, chanSize)

    ticker := time.NewTicker(maxDuration)

    for {

        select {

        case <-ticker.C:

            ticker.Stop()

            fmt.Println("Ticker:operation timedout")

            return c

        case c <- "Random message":

        default:

            fmt.Println("Ticker:chan is full")

            return c

        }

    }

}


func fillChanTimeoutUsingTimeAfter(maxDuration time.Duration, chanSize int) chan string {

    c := make(chan string, chanSize)

    for {

        select {

        case <-time.After(maxDuration):

            fmt.Println("time.After:operation timedout")

            return c

        case c <- "Random message":

        default:

            fmt.Println("time.After:chan is full")

            return c

        }

    }

}

称他们为:


    resWithTicker := fillChanTimeoutUsingTicker(time.Duration(1*time.Microsecond), 10000000)

    fmt.Println(len(resWithTicker))

    resWithTimeAfter := fillChanTimeoutUsingTimeAfter(time.Duration(1*time.Microsecond), 10000000)

    fmt.Println(len(resWithTimeAfter))

印刷:


Ticker:operation timedout

43979

time.After:chan is full

10000000

我认为他们会以完全相同的方式行事,我真的没有得到巨大的差异,对此有什么想法吗?


请注意,还可以像在股票代码功能中一样使用计时器按预期工作。


ITMISS
浏览 198回答 1
1回答

回首忆惘然

问题出在您的代码中。在您的第一个示例中,您正在创建一个股票代码并将其用于超时。在您的第二个示例中,您每次循环时都会创建一个计时器:case <-time.After(maxDuration):从库源中可以看出,这相当于case <- time.NewTimer(maxDuration).C:如果每次循环时都创建一个新的 Ticker/Timer(并丢弃旧的),它可能永远不会触发。因此,为了让您的第二个示例正确运行,请这样做(未经测试):func fillChanTimeoutUsingTimeAfter(maxDuration time.Duration, chanSize int) chan string {&nbsp; &nbsp; c := make(chan string, chanSize)&nbsp; &nbsp; t := time.After(maxDuration)&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; case <-t:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("time.After:operation timedout")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return c&nbsp; &nbsp; &nbsp; &nbsp; case c <- "Random message":&nbsp; &nbsp; &nbsp; &nbsp; default:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println("time.After:chan is full")&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return c&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

Go
我要回答