如果我不取消上下文会怎样?

时间:2017-06-06 15:24:07

标签: go

我有以下代码:

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)
}

如果我没有将defer cancel()放在那里会怎么样? go vet警告过这个

  

context.WithTimeout返回的取消函数应该被调用,而不是丢弃,以避免上下文泄漏

上下文将如何泄露以及这会产生什么影响?感谢

2 个答案:

答案 0 :(得分:25)

如果您无法取消上下文,goroutine that WithCancel or WithTimeout created将无限期地保留在内存中(直到程序关闭),从而导致内存泄漏。如果你经常这么做,你的记忆就会大大增加。最佳做法是在致电defer cancel()WithCancel()后立即使用WithTimeout()

答案 1 :(得分:3)

如果您使用WithCancel,goroutine将无限期地保留在内存中,但是如果您使用WithDeadline或WithTimeout,即使您没有调用取消,goroutine也只会在计时器到期之前保留。

但这仍然不是最佳做法,一旦您完成资源,最好立即致电取消。