如果我不取消上下文会发生什么?
问题描述:
我有下面的代码:如果我没有把defer cancel()
在那里如果我不取消上下文会发生什么?
func Call(ctx context.Context, payload Payload) (Response, error) {
req, err := http.NewRequest(...) // Some code that creates request from payload
ctx, cancel = context.withTimeout(ctx, time.Duration(3) * time.Second)
defer cancel()
return http.DefaultClient.Do(req)
}
会发生什么? go vet
警告这
由context.WithTimeout返回的取消功能应该叫,不丢弃,以避免上下文边跑边
如何上下文被泄露,将这个有什么样的影响?谢谢
答
如果您无法取消上下文,goroutine that WithCancel or WithTimeout created将无限期地保留在内存中(直到程序关闭),导致内存泄漏。如果你做了这么多,你的记忆会显着增加。这是最好的做法是调用WithCancel()
或WithTimeout()
答
如果使用WithCancel的够程将无限期地在内存中保存后立即使用defer cancel()
,但是如果你使用WithDeadline或WithTimeout即使你不打电话取消,则够程仅会一直保持到计时器到期。
虽然这仍然不是最佳做法,但只要您完成资源的调用就可以立即调用cancel。