ホームページ > バックエンド開発 > Golang > Go の「select」ステートメントでタイムリーなコンテキストのキャンセルを保証するにはどうすればよいですか?

Go の「select」ステートメントでタイムリーなコンテキストのキャンセルを保証するにはどうすればよいですか?

DDD
リリース: 2024-12-21 21:21:54
オリジナル
261 人が閲覧しました

How Can I Guarantee Timely Context Cancellation in Go's `select` Statement?

Go でのケース選択の優先順位付け

Go の select ステートメントでは、ケース評価の順序が決定的ではないため、コンテキストを処理するときに潜在的な不一致が発生します。イベントのキャンセルはタイムリーに。一般的なシナリオの 1 つは、定期的なハートビートを送信するバックグラウンド ルーチンに関係しており、コンテキストがキャンセルされるとすぐに停止する必要があります。ただし、選択順序が予測できないため、コンテキストのキャンセル後でもハートビートが送信されることを観察する可能性があります。

コンテキストのキャンセル時にハートビートが即時に終了することを保証するには、より堅牢なアプローチが必要です。ケース評価の順序に依存する代わりに、コンテキストキャンセルケースを明示的に優先する方法が推奨されます。これは、必要な優先順位を持つネストされた select ステートメントを使用することで実現できます。コンテキストキャンセルのケースを外側の select ステートメントに配置し、その後にハートビート機能を処理する 2 番目の select ステートメントを配置する必要があります。

次の変更されたコードを検討してください。 :

func sendRegularHeartbeats(ctx context.Context) {
    ticker := time.NewTicker(time.Second)
    defer ticker.Stop()

    for {
        //outer select, giving priority to context cancellation
        select {
        case <-ctx.Done():
            return
        default:
        }

        //inner select for heartbeat functionality
        select {
        case <-ctx.Done():
            return
        case <-ticker.C:
            sendHeartbeat()
        }
    }
}
ログイン後にコピー

ハートビート処理ケースを外側の選択ステートメント内にネストすることにより、コンテキストキャンセルケースを効果的に優先し、コンテキストがキャンセルされたときに即座に実行されるようにします。これにより、コンテキストのキャンセル後にハートビートが送信される可能性がなくなり、望ましい動作が保証されます。

以上がGo の「select」ステートメントでタイムリーなコンテキストのキャンセルを保証するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート