2017-06-06 23 views
6

Aşağıdaki kod var: Orada defer cancel() koymadı eğerBir Bağlamı iptal etmezsem ne olur?

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

ne olurdu? go vet

nasıl bağlam sızdırılmış olacak Kaçak bir bağlam önlemek için, atılır değil, çağrılmalıdır context.WithTimeout tarafından döndürülen bu

iptal fonksiyonunu uyardı ve bunun etkisi ne olacak? Teşekkürler

cevap

9

Bağlamı iptal edemezseniz, goroutine that WithCancel or WithTimeout created süresiz olarak bellekte kalır (program kapanana kadar), bellek sızıntısına neden olur. Bunu çok yaparsanız, hafızanız önemli ölçüde balon edecektir. Bu demiyorlar bile iptal WithDeadline veya WithTimeout kullanmak ancak eğer, en iyi uygulama derhal WithCancel() veya

0

Eğer goroutine süresiz hafızasında düzenlenecek WithCancel kullanırsanız WithTimeout() çağrıldıktan sonra bir defer cancel() kullanmak var, goroutine sadece edecek zamanlayıcı sona erinceye kadar tutulur.

Bu hala en iyi uygulama değil, kaynakla işiniz bittiğinde iptal etmek her zaman en iyisidir.

İlgili konular