ホームページ >バックエンド開発 >Golang >決定的実行のために Go の「select」ステートメント内のケースに優先順位を付けるにはどうすればよいですか?

決定的実行のために Go の「select」ステートメント内のケースに優先順位を付けるにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-06 09:53:11708ブラウズ

How to Prioritize Cases in Go's `select` Statements for Deterministic Execution?

Go の select ステートメントでの優先順位の指定

Go で select ステートメントを使用する場合、ケース評価の順序は通常、決定的ではありません。ただし、シナリオによっては、特定のケースの実行を優先する必要がある場合があります。

コンテキストのキャンセルによる優先順位

正常にシャットダウンする次のコードを検討してください。コンテキストがキャンセルされたときのハートビート送信者:

func sendRegularHeartbeats(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            return
        case <-time.After(1 * time.Second):
            sendHeartbeat()
        }
    }
}

ただし、コンテキストがすぐに閉じられると、コードは「Done」ケースが実行される前にハートビートが送信される可能性があります。

解決策: ヘルパー チャネルによる優先順位

これを解決する 1 つのアプローチは、ヘルパー チャネルを使用してコンテキストキャンセルのケースを優先します:

func sendRegularHeartbeats(ctx context.Context) {
    done := make(chan struct{})
    go func() {
        <-ctx.Done()
        close(done)
    }()

    for {
        select {
        case <-done:
            return
        case <-time.After(1 * time.Second):
            sendHeartbeat()
        }
    }
}

この場合、done チャネルは、 "ctx.Done()" ケースは、コンテキストがキャンセルされるときに最初に評価されます。

追加の考慮事項

この解決策は優先度を向上させますが、可能性を完全に排除するわけではありません。 「完了」ケースが実行される前に送信されるハートビートの状態。真に同期されたシャットダウンを実現するには、アトミック変数やミューテックスなどの同期プリミティブを使用して、コンテキストのキャンセルと同時にハートビート送信が確実に終了されるようにすることを検討してください。

以上が決定的実行のために Go の「select」ステートメント内のケースに優先順位を付けるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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