Go Wiki:超时和截止时间

要放弃运行时间过长的同步调用,请使用带 time.After 的 select 语句

import "time"

c := make(chan error, 1)
go func() { c <- client.Call("Service.Method", args, &reply) } ()
select {
  case err := <-c:
    // use err and reply
  case <-time.After(timeoutNanoseconds):
    // call timed out
}

请注意,通道 c 的缓冲区大小为 1。如果它是一个无缓冲通道,并且 client.Call 方法花费的时间超过 timeoutNanoseconds,则通道发送将永远阻塞,并且 goroutine 永远不会被销毁。

参考

time.After:https://pkg.go.dev/time/#After

select:https://golang.ac.cn/ref/spec#Select_statements

博客文章:https://golang.ac.cn/blog/2010/09/go-concurrency-patterns-timing-out-and.html


此内容是 Go Wiki 的一部分。