Go语言 实现超时是很常见的方法,为什么time.After不起作用

gblwokeq  于 2023-06-19  发布在  Go
关注(0)|答案(1)|浏览(131)

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
*/
bvk5enib

bvk5enib1#

在每个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
        }
    }

相关问题