Dalam bersamaan Golang, mengurus banyak saluran perkongsian goroutine dengan berkesan adalah penting. Memahami dan menyelesaikan situasi kebuntuan menjadi penting untuk operasi yang lancar.
Masalahnya
Anda telah mengalami ralat kebuntuan dalam kod Golang anda, di mana gorout berhenti berkembang dan tidak menghasilkan sebarang hasil . Khususnya, kod anda melibatkan berbilang pengeluar menambah nilai pada saluran untuk tempoh terhad dan pengguna yang terus mengambil nilai daripada saluran, tanpa sebarang syarat penamatan.
Punca Kebuntuan
Kebuntuan berlaku kerana saluran tidak ditutup dengan betul, menunjukkan tamatnya pengeluaran nilai. Tanpa saluran tertutup, goroutine pengguna menunggu selama-lamanya untuk lebih banyak nilai, manakala goroutine pengeluar telah pun menyelesaikan tugas mereka.
Penyelesaian Cekap
Untuk menyelesaikan kebuntuan ini, anda perlu mengikuti langkah berikut:
Pelaksanaan
Berikut ialah versi semakan kod anda yang menangani isu kebuntuan:
<code class="go">import ( "fmt" "sync" "time" ) func producer(ch chan int, d time.Duration, num int, wg *sync.WaitGroup) { defer wg.Done() for i := 0; i < num; i++ { ch <- i time.Sleep(d) } } func main() { wg := &sync.WaitGroup{} ch := make(chan int) wg.Add(1) go producer(ch, 100*time.Millisecond, 2, wg) wg.Add(1) go producer(ch, 200*time.Millisecond, 5, wg) go func() { wg.Wait() close(ch) }() for v := range ch { fmt.Println(v) } }</code>
Dengan melaksanakan perubahan ini, anda menghapuskan kebuntuan dengan menyelaraskan penyiapan goroutine pengeluar, menutup saluran dengan sewajarnya dan menggunakan julat untuk menggunakan nilai saluran dengan berkesan.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Isu Kebuntuan dalam Pengaturcaraan Serentak Golang dengan Saluran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!