首页 > 文章列表 > 为什么 time.After 无法实现超时效果?

为什么 time.After 无法实现超时效果?

433 2024-02-23
问题内容

go代码如下所示,我尝试通过go例程打印“结果”。为什么“超时”不是在3秒后打印,而是在10秒后打印。因为所有10个“结果”都打印。

package main
import "fmt"
import "time"


func main() {
  ch := make(chan string)
  go func() {
    for i:=0;i<10;i++ {
      time.Sleep(time.Second * 1)
      ch <- "result"
    }
      
  }()
  for {
    select {
    case res := <-ch:
        fmt.Println(res)
    case <-time.After(time.Second * 3):
        fmt.Println("timeout")
        return
    }
  }
}
/**
result
result
result
result
result
result
result
result
result
result
timeout
*/


正确答案


在每个 for 循环中,在 case res := <-ch 之后,创建一个新通道 <-time.after(time.second * 3)。

这个修复可能是你想要的:

timeoutChan := time.After(time.Second * 3)
    for {
        select {
        case res := <-ch:
            fmt.Println(res)
        case <-timeoutChan:
            fmt.Println("timeout")
            return
        }
    }