2017-06-06 6 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を使用している場合は、すぐにWithCancel()またはWithTimeout()

0

を呼び出した後ゴルーチンがゴルーチンだけでしょう、あなたはWithDeadlineやWithTimeoutを使用するただし場合は、キャンセルを呼び出していない場合でも、メモリ内に無期限に開催されますdefer cancel()を使用するのがベストプラクティスそれをですタイマーが終了するまで保持されます。

これはまだベストプラクティスではありませんが、リソースの処理が完了次第、すぐにキャンセルを呼び出すことをお勧めします。

関連する問題