Go では、コンテキスト パッケージはリクエストの期限とキャンセルを管理するためのメカニズムを提供します。キャンセル コールバックが呼び出されないとコンテキスト リークが発生する可能性があり、リソースを大量に消費するクリーンアップ操作やパフォーマンスへの影響が生じる可能性があります。
次のコード スニペットを検討してください。
func Call(ctx context.Context, payload Payload) (Response, error) { req, err := http.NewRequest(...) ctx, cancel = context.withTimeout(ctx, time.Duration(3) * time.Second) // defer cancel() missing! return http.DefaultClient.Do(req) }
go vet ツールは、省略された defer cancel() 呼び出しについて正しく警告します。
キャンセル呼び出しがないと、WithCancel または WithTimeout によって作成されたゴルーチンが無期限に (プログラムがシャットダウンするまで) メモリ内に残り、メモリ リークが発生するため、この呼び出しは重要です。この動作が何度も繰り返されると、メモリ使用量が急増します。
キャンセルされていないコンテキストは、パフォーマンスのボトルネックを引き起こす可能性があります。コンテキストがキャンセルされた HTTP リクエストが不完全なままである場合、それを処理するためにリソースが消費され、リクエストが再試行される可能性があります。
コンテキストのリークを防ぎ、効率的なリソース管理を確保するには、次のようにします。 WithCancel() または WithTimeout() を呼び出した直後に defer cancel() を使用するベスト プラクティスです。これにより、コンテキストが不要になったときにクリーンアップ操作が即座にトリガーされるようになります。
以上がGo の Context Package で `defer cancel()` が重要なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。