Koncurrency dan Komunikasi Saluran di Golang: Membaca dari Pelbagai Saluran Secara serentak
Di alam Golang, anda mungkin menghadapi keperluan untuk membaca daripada berbilang saluran serentak. Pertanyaan khusus ini tertumpu kepada membina persediaan saluran 'mana-mana-satu', di mana dua rutin pergi (numgen1 dan numgen2) menulis nombor secara serentak untuk memisahkan saluran (num1 dan num2) dan matlamatnya adalah untuk mengagregatkan nombor ini dalam langkah ketiga -rutin (tambahan).
Pertimbangkan perkara berikut:
<code class="go">func addnum(num1, num2, sum chan int) { done := make(chan bool) go func() { n1 := <-num1 done <- true }() n2 := <-num2 <-done sum <- (n1 + n2) }</code>
Isu:
Malangnya, coretan kod yang disediakan adalah cacat. Ia bergantung pada mekanisme pengundian, dan ia terdedah kepada kebuntuan.
Penyelesaian:
Penyelesaian yang teguh kepada masalah ini melibatkan penggunaan pernyataan terpilih:
func main() {
c1 := make(chan int)
c2 := make(chan int)
out := make(chan int)
go func(in1, in2 <-chan int, out chan<- int) {
for {
select {
case n1 := <-in1:
out <- n1
case n2 := <-in2:
out <- n2
}
}
}(c1, c2, out)
}<p>Kaedah ini secara elegan mengendalikan situasi di mana data mungkin tiba pada mana-mana saluran pada selang masa yang tidak dapat diramalkan. Ia juga menghapuskan risiko kebuntuan dengan sentiasa menunggu input daripada kedua-dua sumber.<strong></strong>Ingat untuk menggunakan jenis saluran berarah sebagai parameter rasmi untuk fungsi goroutine. Amalan ini meningkatkan keselamatan kod dengan memastikan pengkompil membantu mencegah penggunaan saluran yang tidak betul.</p>
<p>Dengan cerapan ini, anda kini boleh mengurus komunikasi saluran serentak di Golang dengan yakin.</p>
Atas ialah kandungan terperinci Bagaimana untuk Membaca Serentak daripada Berbilang Saluran dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!