我很难理解上下文的“寿命”。
我正在接收RPC请求,并使用context.WithValue
存储请求ID,以便可以将其用于日志记录。服务中没有上下文的截止日期或超时。
RPC调用的方法之一从数据库中提取一些数据,调用goroutine进行一些处理(与客户端无关),发送响应,然后该方法返回。方法返回后,goroutine可能会运行约15秒。
我在goroutine中多次记录了请求ID,到目前为止,它仍然可以正常工作,但是是否有可能会垃圾回收上下文并且在尝试使用它时不可用的情况?还是会知道在我的goroutine完成之前保持上下文相关?
这使我想到另一个问题-我没有使用context.WithCancel
,这是否意味着它将无限期保留在内存中?我想过一会儿会导致一些性能问题。
答案 0 :(得分:0)
上下文是美化的渠道。根据上下文的来源,确定如何回收它:
如果创建上下文(context.WithCancel
等),请确保在它代表的子任务完成时回收(defer cancelfn()
等,以确保在API返回时发生)。
如果您使用的是来自外部来源的上下文(例如gRPC请求),则API框架有责任关闭该上下文。
只要没有活动的引用(函数关闭等),go就会在GC期间回收任何内存