ホームページ >バックエンド開発 >Golang >Go の Context Package で `defer cancel()` が重要なのはなぜですか?

Go の Context Package で `defer cancel()` が重要なのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-04 07:13:14396ブラウズ

Why Is `defer cancel()` Crucial in Go's Context Package?

コンテキストのキャンセル: 遅延の無視の影響

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。