我希望为一个名为foo的函数设置超时.请考虑以下几点

func fooWithTimeout(d time.Duration) error {
    ch := make(chan error, 1)
    go func() {
        ch <- foo()
    }()

    select {
    case err := <-ch:
        return err
    case <-time.After(d):
        return errors.New("foo has timed out")
    }
}
  • 如果foo已经超时,那么foo是否能够写入通道ch,或者是否存在Goroutine阻塞或死机的风险?
  • 一旦fooWithTimeout退出,通道ch会发生什么情况?
  • 此代码是否存在潜在问题?
  • 在拨打foo之前,我应该在go func(){...}()内加defer close(ch)吗?
  • 在本例中,我使用缓冲通道(大小为1)还是非缓冲通道有关系吗?

推荐答案

计时器滴答作响后,fooWithTimeout将返回.大猩猩将继续运行,直到foo返回.

如果foo个超时,它将写入通道ch,因为它是缓冲的.

如果foo返回,则通道ch最终将被垃圾收集.

你不需要关闭频道.一旦它超出范围,它将被垃圾收集.

呼叫fooWithTimeout的大量突发将产生大量资源.每次调用都会创建两个Goroutine.正确的超时方法是将foo更改为使用上下文.

Go相关问答推荐

获取k8s群集作用域运算符的命名空间

戈姆:如何将一对一联系起来?

如何在gofiber/websocket/v2中设置状态代码和原因

Python样式生成器实现为通道:过早读取

如何获取集群外go Kubernetes客户端的当前命名空间?

Json.Unmarshal() 和 gin.BindJson() 之间的区别

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

AWS Lambda 中的 Websocket URL 超时达到错误

从给定顶点查找图形中所有闭合路径的算法

AddE 上的 Apache Tinkerpop gremlin-go 驱动程序 Next() 返回E0903:没有剩余结果

无法使用 Golang 扫描文件路径

Gorm 在保存/创建时序列化 struct

同时调用应该只获取一次数据

如何优雅地映射到 Go 中返回可变长度数组的方法?

GOLANG 如何使用 http.FileServer 从模板目录加载某个 html 文件

带有 grpc 的 protobuf 用于拆分包中的 Go

为什么 template.ParseFiles() 没有检测到这个错误?

如何解决在mac m1中运行gcc失败退出状态1?

如何断言类型是指向golang中接口的指针

如何在程序退出时使用 golang 删除文件?