Menyelesaikan Kebuntuan Goroutine dalam Go Concurrency
Dalam program Go serentak, kebuntuan boleh berlaku apabila goroutine menunggu selama-lamanya untuk melepaskan sumber. Untuk menyelesaikan kebuntuan tersebut, pertimbangkan contoh berikut:
<code class="go">// Create a channel for communication between goroutines. ch := make(chan int) // Start producer goroutines that send values to the channel. go producer(ch, 100*time.Millisecond, 2) go producer(ch, 200*time.Millisecond, 5) // Indefinite loop to continuously receive values from the channel. for { fmt.Println(<-ch) }</code>
Kod ini mengakibatkan ralat jalan buntu: "ralat maut: semua gorouti sedang tidur - kebuntuan!" Ini berlaku kerana pengeluar mempunyai jangka hayat yang terhad, akhirnya menghentikan penghantaran, manakala goroutine pengguna tanpa henti menunggu nilai baharu. Untuk mengelakkan kebuntuan ini, dua strategi utama boleh digunakan:
1. Penamatan Saluran:
Memandangkan saluran hanya boleh ditutup sekali, adalah penting bagi pengeluar untuk memberi isyarat penamatan kepada pengguna. Penyelaras boleh memantau penyiapan pengeluar dan menutup saluran dengan sewajarnya.
2. Penyegerakan Terselaras:
Menggunakan penyegerakan primitif seperti penyegerakan.WaitGroup, pengeluar boleh memberitahu penyelaras apabila mereka selesai dan penyelaras boleh menutup saluran setelah semua pengeluar selesai.
Kod Kemas Kini Menggunakan Penyegerakan:
<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() { // Create a WaitGroup for coordinating producer completion. wg := &sync.WaitGroup{} // Initialize the channel for communication between goroutines. ch := make(chan int) // Start producer goroutines. wg.Add(2) go producer(ch, 100*time.Millisecond, 2, wg) go producer(ch, 200*time.Millisecond, 5, wg) // Assign a goroutine to close the channel when all producers have finished. go func() { wg.Wait() close(ch) }() // Iterate over values from the channel until it's closed. for v := range ch { fmt.Println(v) } }</code>
Kesimpulan:
Dengan melaksanakan sama ada penamatan saluran atau penyegerakan yang diselaraskan, pembangun boleh mengelakkan kebuntuan goroutine dengan berkesan dan memastikan penyelarasan yang betul dalam program Go serentak.
Atas ialah kandungan terperinci ## Bagaimana untuk Mengelakkan Kebuntuan dalam Program Go Serentak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!