Go Channels dan Deadlocks
Dalam Go, saluran digunakan untuk berkomunikasi antara goroutine. Walau bagaimanapun, jika saluran tidak dikendalikan dengan betul, kebuntuan boleh berlaku.
Pertimbangkan kod berikut:
<code class="go">func main() { c1 := make(chan int) c2 := make(chan int) go func() { for i := range c1 { println("G1 got", i) c2 <- i } }() go func() { for i := range c2 { println("G2 got", i) c1 <- i } }() c1 <- 1 time.Sleep(1000000000 * 50) }</code>
Kod ini mencetak nombor tanpa had sehingga fungsi utama keluar. Walau bagaimanapun, jika kami menghantar nilai lain ke salah satu saluran daripada fungsi utama, program menyekat:
<code class="go">func main() { c1 := make(chan int) c2 := make(chan int) go func() { for i := range c1 { println("G1 got", i) c2 <- i } }() go func() { for i := range c2 { println("G2 got", i) c1 <- i } }() c1 <- 1 time.Sleep(1000000000 * 1) c1 <- 2 time.Sleep(1000000000 * 50) }</code>
Ini berlaku kerana goroutine kedua tidak pernah menerima nilai "2" yang dihantar ke c1. Sebab kebuntuan ini ialah kedua-dua gorout sedang menunggu antara satu sama lain untuk menghantar dan menerima nilai, mewujudkan kebergantungan bulat.
Menyahpepijat Kebuntuan
Untuk nyahpepijat kebuntuan, beberapa pendekatan boleh digunakan:
Atas ialah kandungan terperinci Bagaimanakah Kebuntuan Boleh Berlaku dalam Saluran Go dan Cara Menyahpepijatnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!