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!