Rumah > Artikel > pembangunan bahagian belakang > Mengapakah Operasi Saluran Berantai dalam Penyata `pilih` Go Membawa kepada Kebuntuan?
Operasi Saluran Berantai dalam Kes Terpilih: Memahami Kebuntuan
In Go, fungsi fanIn mengagregatkan nilai daripada berbilang saluran input ke dalam satu output saluran, menyediakan satu bentuk pemultipleksan. Pernyataan pilih dalam fungsi fanIn menggunakan operasi tidak menyekat <- untuk membaca daripada berbilang saluran input secara serentak.
Walau bagaimanapun, jika pernyataan pilih diubah suai untuk memasukkan operasi saluran berantai, seperti:
select { case ch <- <-input1: case ch <- <-input2: }
kelakuan aneh boleh berlaku. Sesetengah nilai mungkin digugurkan, membawa kepada jalan buntu.
Untuk memahami sebab ini berlaku, adalah penting untuk diingat bahawa dalam pernyataan pilihan, hanya satu saluran operasi baca atau tulis tidak menyekat. Yang lain berkelakuan seolah-olah operator blok telah digunakan.
Dalam fungsi fanIn yang diubah suai, kes pertama membaca nilai daripada input1 dan cuba menulisnya ke ch dengan cara yang tidak menyekat. Ini boleh berjaya jika fungsi utama menggunakan nilai dengan segera. Walau bagaimanapun, terdapat kemungkinan kecil bahawa gelung fungsi utama mungkin tidak cukup pantas untuk melakukan ini.
Dalam lelaran gelung fanIn yang berikutnya, kes kedua mungkin akan dipilih, dan pada masa ini, goroutine kedua mungkin telah menulis nilai kepada ch. Walau bagaimanapun, jika fungsi utama belum lagi menggunakan nilai daripada lelaran sebelumnya, ia akan digugurkan.
Kitaran penurunan nilai ini akhirnya membawa kepada situasi di mana tiada lagi penulis, tetapi pembaca adalah masih menunggu nilai, mengakibatkan kebuntuan.
Versi kod yang diubah suai menunjukkan isu ini dengan lebih jelas: https://play.golang.org/p/lcM5OKx09Dj
Atas ialah kandungan terperinci Mengapakah Operasi Saluran Berantai dalam Penyata `pilih` Go Membawa kepada Kebuntuan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!