Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mengutamakan Pembatalan Konteks dalam Penyata `pilih` Go?

Bagaimanakah Saya Boleh Mengutamakan Pembatalan Konteks dalam Penyata `pilih` Go?

Patricia Arquette
Patricia Arquetteasal
2024-12-10 09:59:16125semak imbas

How Can I Prioritize Context Cancellation in Go's `select` Statements?

Menangani Keutamaan dalam Penyata Go Select

Dalam senario tertentu, menjadi penting untuk mengutamakan pelaksanaan blok kes dalam penyataan pilihan. Khususnya, apabila bekerja dengan konteks yang mewakili peristiwa pembatalan, isyarat Selesai dikendalikan dengan segera untuk memastikan penamatan program yang betul.

Pertimbangkan kod berikut:

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

Rutin ini berjalan dalam goroutine yang berasingan dan menghantar degupan jantung pada selang masa yang tetap. Walau bagaimanapun, apabila konteks dibatalkan, kod itu kadangkala masih menghantar degupan jantung sebelum kes Selesai diproses.

Tingkah laku lalai bagi pernyataan pilihan tidak menjamin susunan penilaian kes, menjadikannya perlu untuk menguatkuasakan keutamaan yang dikehendaki secara eksplisit. Satu pendekatan yang tidak sempurna ialah menyemak konteks tertutup sebelum melakukan penghantaran degupan jantung.

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

    for {
        // First select
        select {
        case <-ctx.Done():
            return
        default:
        }

        // Second select
        select {
        case <-ctx.Done():
            return
        case <-ticker.C:
            // Check if context is done again in case a concurrent Done event arrived
            select {
            case <-ctx.Done():
            default:
            }
            sendHeartbeat()
        }
    }
}

Walaupun kaedah ini mengutamakan isyarat Selesai, kaedah ini memperkenalkan keadaan perlumbaan tambahan. Jika peristiwa Selesai dan peristiwa detik berlaku serentak, penghantaran degupan jantung mungkin berlaku sebelum peristiwa Selesai dikendalikan.

Malangnya, pada masa ini tiada penyelesaian sempurna untuk isu ini dalam Go. Walau bagaimanapun, penyelesaian yang disediakan menawarkan penambahbaikan kepada kod asal dengan memperkenalkan pernyataan pilihan bersarang untuk meminimumkan kebarangkalian keadaan perlumbaan sedemikian.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengutamakan Pembatalan Konteks dalam Penyata `pilih` Go?. 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