2017-06-06 68 views
6

我有下面的代碼:如果我沒有把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返回的取消功能應該叫,不丟棄,以避免上下文邊跑邊

如何上下文被泄露,將這個有什麼樣的影響?謝謝

回答

9

如果您無法取消上下文,goroutine that WithCancel or WithTimeout created將無限期地保留在內存中(直到程序關閉),導致內存泄漏。如果你做了這麼多,你的記憶會顯着增加。這是最好的做法是調用WithCancel()WithTimeout()

0

如果使用WithCancel的夠程將無限期地在內存中保存後立即使用defer cancel(),但是如果你使用WithDeadline或WithTimeout即使你不打電話取消,則夠程僅會一直保持到計時器到期。

雖然這仍然不是最佳做法,但只要您完成資源的調用就可以立即調用cancel。

相關問題