Rumah > Artikel > pembangunan bahagian belakang > Bagaimana untuk Memperbaiki \"ralat maut: semua goroutine sedang tidur - kebuntuan\" dalam Go?
Go: Memahami dan Menyelesaikan "ralat maut: semua goroutine sedang tidur - kebuntuan"
Apabila melaksanakan program Go, menghadapi mesej ralat "ralat maut: semua gorouti sedang tidur - kebuntuan" menunjukkan bahawa semua gorouti program (benang ringan) disekat selama-lamanya, mengakibatkan kebuntuan.
Dalam kod yang disediakan, isu ini timbul disebabkan sifat tidak buffer saluran "file1chan". Apabila nilai dihantar ke saluran tidak buffer, ia menyekat jika tiada goroutine lain bersedia untuk menerimanya. Dalam kes ini, goroutine utama menghantar nilai kepada "file1chan" tanpa sebarang goroutin serentak menerima daripadanya, yang membawa kepada kebuntuan.
Penyelesaian 1: Memperkenalkan Corak Konkurensi
Untuk menyelesaikan kebuntuan, perkenalkan goroutine serentak yang berasingan yang menerima nilai daripada "file1chan" dan mengelakkan daripada menyekat goroutine utama. Kod yang diubah suai dengan pendekatan goroutine di bawah:
func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string) go func() { for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) }() print(file1chan) }
Penyelesaian 2: Gunakan Saluran Penimbalan
Sebagai alternatif, anda boleh menggunakan saluran penimbal untuk mengendalikan nombor tetap nilai tanpa menyebabkan kebuntuan. Saluran penimbal dengan kapasiti satu sudah memadai untuk tugasan ini:
func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string, 1) for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) print(file1chan) }
Dengan saluran penimbal, pengirim boleh terus melaksanakan walaupun penerima belum bersedia, sekali gus mengelakkan kebuntuan.
Atas ialah kandungan terperinci Bagaimana untuk Memperbaiki \"ralat maut: semua goroutine sedang tidur - kebuntuan\" dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!