What happens if I don't cancel a Context?

倾然丶 夕夏残阳落幕 提交于 2021-01-20 15:13:08

问题


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:


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:


If you use WithCancel the goroutine will be held indefinitely in memory, however if you use WithDeadline or WithTimeout even if you don't call 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.



来源:https://stackoverflow.com/questions/44393995/what-happens-if-i-dont-cancel-a-context

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!