Rumah >pembangunan bahagian belakang >Golang >Bagaimana Mengutamakan Kes dalam Pernyataan `pilih` Go untuk Pelaksanaan Deterministik?

Bagaimana Mengutamakan Kes dalam Pernyataan `pilih` Go untuk Pelaksanaan Deterministik?

Patricia Arquette
Patricia Arquetteasal
2024-12-06 09:53:11660semak imbas

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

Mengatasi Keutamaan dalam Penyata pilih Go

Apabila menggunakan penyataan pilih dalam Go, susunan penilaian kes biasanya tidak bersifat deterministik. Walau bagaimanapun, dalam sesetengah senario, kami mungkin perlu mengutamakan pelaksanaan kes tertentu.

Keutamaan dengan Pembatalan Konteks

Pertimbangkan kod berikut yang kami mahu tutup dengan anggun pengirim degupan jantung apabila konteks dibatalkan:

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

Namun, apabila konteks ditutup serta-merta, kod mungkin masih menghantar degupan jantung sebelum kes "Selesai" dilaksanakan.

Penyelesaian: Keutamaan dengan Saluran Pembantu

Satu pendekatan untuk menyelesaikan masalah ini ialah menggunakan saluran pembantu untuk mengutamakan kes pembatalan konteks:

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()
        }
    }
}

Dalam kes ini, saluran selesai memastikan bahawa kes "ctx.Done()" dinilai terlebih dahulu apabila konteksnya dibatalkan.

Pertimbangan Tambahan

Walaupun penyelesaian ini meningkatkan keutamaan, ia tidak sepenuhnya menghapuskan kemungkinan degupan jantung dihantar sebelum kes "Selesai" dilaksanakan. Untuk penutupan yang benar-benar disegerakkan, pertimbangkan untuk menggunakan primitif penyegerakan seperti pembolehubah atom atau mutex untuk memastikan penghantaran degupan jantung ditamatkan serta-merta selepas pembatalan konteks.

Atas ialah kandungan terperinci Bagaimana Mengutamakan Kes dalam Pernyataan `pilih` Go untuk Pelaksanaan Deterministik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn