登录
首页 >  Golang >  Go问答

了解生命周期的含义

来源:stackoverflow

时间:2024-03-20 11:21:30 164浏览 收藏

“生命周期”指的是上下文的可用性期。在 RPC 请求中,上下文通常在请求处理期间可用。但是,如果您在 goroutine 中使用上下文,则需要考虑上下文是否会在 goroutine 完成之前被垃圾回收。

问题内容

我在理解上下文的“生命周期”方面遇到了一些困难。

我正在接收 RPC 请求,并使用 context.WithValue 存储请求 ID,以便将其用于日志记录。我的服务中的上下文没有截止日期或超时。

RPC调用的方法之一从数据库中拉取一些数据,调用goroutine做一些处理(与客户端无关),发送响应,然后该方法返回。该方法返回后,goroutine 可以运行大约 15 秒。

我在 goroutine 中记录了几次请求 ID,到目前为止它工作正常,但是是否存在上下文可能被垃圾收集并且当我尝试使用它时不可用的情况?或者会知道在我的 goroutine 完成之前保留上下文?

这让我想到了另一个问题 - 我没有使用 context.WithCancel,这是否意味着它将无限期地保留在内存中?我想一段时间后这可能会导致一些性能问题。


解决方案


上下文是一个美化的完成通道。根据上下文的来源,确定应如何回收它:

如果您创建上下文(context.WithCancel 等),请确保在它代表的子任务完成时回收它(defer cancelfn() 等,确保在 API 返回时发生这种情况)。

如果您使用来自外部源的上下文(例如 gRPC 请求) - API 框架有责任关闭上下文。

只要没有活动引用(函数闭包等),go 就会在 GC 期间回收所有内存

理论要掌握,实操不能落!以上关于《了解生命周期的含义》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>