Go: Deadlock Panic - Memahami Punca dan Membetulkannya
Dalam Go, ralat biasa yang dihadapi ialah "ralat maut: semua goroutine adalah tidur - kebuntuan!" apabila cuba menguruskan komunikasi antara goroutine. Ralat ini timbul apabila goroutine tersekat dalam keadaan di mana mereka semua menunggu antara satu sama lain untuk meneruskan.
Pernyataan Masalah
Pertimbangkan kod berikut yang ingin anda baca sebaris perkataan daripada fail teks, simpannya dalam saluran, dan kemudian cetaknya secara individu:
func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string) for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } print(file1chan) } func print(in <-chan string) { for str := range in { fmt.Printf("%s\n", str) } }
Punca Kebuntuan
Setelah menjalankan kod ini, anda menghadapi ralat kebuntuan. Ini berlaku kerana fail1chan saluran tidak dibuffer. Akibatnya, apabila anda cuba menghantar nilai ke dalam saluran, ia menyekat selama-lamanya, menunggu penerima.
Membetulkan Kebuntuan
Untuk menyelesaikan kebuntuan, anda mempunyai dua pilihan:
Gunakan Buffered Saluran:
Anda boleh mencipta saluran penimbal dengan menyatakan saiznya sebagai hujah kedua untuk dibuat(chan), seperti ini:
file1chan := make(chan string, 1) // buffer size of one
Saluran penimbal bertindak seperti tatasusunan, di mana penghantar boleh menghantar nilai tanpa menyekat jika saluran mempunyai kapasiti yang tersedia.
Gunakan yang Baharu Goroutine:
Anda boleh memulakan goroutine baharu untuk menghantar nilai ke saluran tanpa buffer:
file1chan := make(chan string) go func() { // start a new goroutine that sends strings down file1chan for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) }() print(file1chan)
Dengan pendekatan ini, goroutine baharu memikul tanggungjawab menghantar nilai, manakala goroutine utama memfokuskan semasa mencetaknya.
Dengan melaksanakan salah satu daripada ini penyelesaian, anda menghapuskan kebuntuan dengan berkesan dan membolehkan komunikasi lancar antara gorouti anda.
Atas ialah kandungan terperinci Mengapakah program Go menghadapi \'ralat maut: semua gorouti sedang tidur - kebuntuan!\' dan bagaimanakah ia boleh dibetulkan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!