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

huangapple go评论92阅读模式
英文:

What happens if I don't cancel a Context?

问题

如果没有使用defer cancel(),上述代码中的cancel函数将不会被调用,从而导致上下文泄漏。上下文泄漏指的是在不再需要的情况下,没有正确地取消或释放上下文资源。这可能会导致以下问题:

  1. 资源泄漏:上下文对象可能持有一些资源,如打开的文件或数据库连接。如果上下文没有被取消,这些资源可能会一直被占用,导致资源泄漏。

  2. 内存泄漏:上下文对象本身可能占用一些内存空间。如果上下文没有被取消,这些内存空间可能无法被垃圾回收,导致内存泄漏。

  3. 阻塞或超时:如果上下文没有被取消,可能会导致一些操作一直处于等待状态,或者超时时间被无限延长,从而影响程序的正常执行。

为了避免上下文泄漏,应该始终在不再需要上下文时调用cancel函数,以便及时释放相关资源并取消相关操作。使用defer cancel()可以确保在函数返回之前调用cancel函数,即使发生错误也不会被忽略。这样可以有效地避免上下文泄漏问题。

英文:

I have the following code:

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

What would happen if I didn't put defer cancel() in there? go vet warned this
> the cancel function returned by context.WithTimeout should be called, not discarded, to avoid a context leak

How will the context be leaked and what impact will this have? Thanks

答案1

得分: 74

如果你没有成功取消上下文,那么由WithCancelWithTimeout创建的goroutine将会无限期地保留在内存中(直到程序关闭),导致内存泄漏。如果你经常这样做,你的内存使用量将会显著增加。最佳实践是在调用WithCancel()WithTimeout()之后立即使用defer cancel()

英文:

If you fail to cancel the context, the goroutine that WithCancel or WithTimeout created will be retained in memory indefinitely (until the program shuts down), causing a memory leak. If you do this a lot, your memory will balloon significantly. It's best practice to use a defer cancel() immediately after calling WithCancel() or WithTimeout()

答案2

得分: 27

如果使用WithCancel,_goroutine_将无限期地保留在内存中。然而,如果使用WithDeadlineWithTimeout而不调用cancel,_goroutine_只会在计时器到期之前保留。

然而,这仍然不是最佳实践,最好在使用完资源后立即调用cancel。

英文:

If you use WithCancel, the goroutine will be held indefinitely in memory. However, if you use WithDeadline or WithTimeout without calling cancel, the goroutine will only be held until the timer expires.

This is still not best practice though, it's always best to call cancel as soon as you're done with the resource.

huangapple
  • 本文由 发表于 2017年6月6日 23:24:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/44393995.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定