Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Kebuntuan Boleh Berlaku dalam Saluran Go dan Cara Menyahpepijatnya?
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!