Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah Go Multiplexer Boleh Memastikan Capaian Adil dan Selamat Merentasi Berbilang Saluran Input?
Pemultipleks Saluran dengan Akses Sama
Pemultipleks Go ini bertujuan untuk menggabungkan output berbilang saluran menjadi satu, memastikan setiap saluran input mempunyai hak yang sama kepada saluran keluaran. Walau bagaimanapun, ujian yang disediakan memberikan hasil yang tidak dijangka.
Analisis Isu
Isu kritikal terletak pada goroutine yang dihasilkan daripada fungsi Mux. Parameter saluran c, bertujuan untuk mewakili setiap saluran input, sedang dikemas kini pada setiap lelaran gelung. Ini bermakna semua goroutine akhirnya menarik diri daripada saluran yang sama dan bukannya saluran individu yang dimaksudkan.
Penyelesaian
Untuk menyelesaikan isu ini, ubah suai gelung penciptaan goroutine untuk lulus saluran yang betul untuk setiap goroutine:
for _, c := range channels { go func(c <-chan big.Int) { ... }(c) }
Dengan melakukan ini, setiap goroutine menangkap nilai saluran apabila ia dibuat, menghapuskan isu dan menghasilkan hasil yang diingini.
Meningkatkan Keselamatan Selaras
Selain memastikan akses yang sama kepada saluran output, ia adalah penting untuk memastikan keselamatan serentak. Kod awal menggunakan pembolehubah int n untuk menjejaki penutupan saluran input. Walau bagaimanapun, dengan GOMAXPROCS lebih daripada 1, berbilang gorout boleh mengakses n serentak, yang berpotensi menyebabkan keadaan perlumbaan.
Pendekatan yang lebih selamat ialah menggunakan objek penyegerakan.WaitGroup, yang membenarkan gorout menunggu antara satu sama lain dan memastikan bahawa n dikemas kini dengan selamat. Kod yang disemak menggunakan penyegerakan.WaitGroup:
import ( "math/big" "sync" ) // ... other code ... // The channel to output to. ch := make(chan big.Int, len(channels)) var wg sync.WaitGroup wg.Add(len(channels)) // ... other code ... // Close the channel when the pumping is finished. go func() { // Wait for everyone to be done. wg.Wait() // Close. close(ch) }()
Dengan pengubahsuaian ini, pemultipleks kini beroperasi dengan betul dan selamat, memastikan semua saluran input mempunyai akses yang sama kepada saluran output dan mengelakkan keadaan perlumbaan.
Atas ialah kandungan terperinci Bagaimanakah Go Multiplexer Boleh Memastikan Capaian Adil dan Selamat Merentasi Berbilang Saluran Input?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!