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