如果我不取消上下文会发生什么?

问题描述:

我有下面的代码:如果我没有把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。