Go: Fatal Error "All Goroutines Are Sleep - Deadlock" Dijelaskan
Dalam Go, menghantar ke saluran tidak buffer menghalang pengirim sehingga penerima tersedia. Dalam kod yang disediakan, goroutine yang bertanggungjawab untuk menghantar perkataan ke saluran file1chan ialah satu-satunya goroutine dan tiada penerima. Akibatnya, pengirim disekat selama-lamanya, membawa kepada jalan buntu.
Penyelesaian Menggunakan Goroutine Baharu:
Satu penyelesaian ialah mencipta goroutine berasingan untuk mengendalikan penghantaran perkataan. Goroutine ini tidak akan menyekat goroutine utama dan membenarkan pelaksanaan serentak.
func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string) go func() { // start a new goroutine that sends strings down file1chan for scanner.Scan() { line := scanner.Text() // Split the line on a space parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) }() print(file1chan) // read strings from file1chan }
Penyelesaian Menggunakan Saluran Penampan:
Penyelesaian lain ialah mencipta saluran penimbal, yang membolehkan berbilang nilai dihantar dan diterima serentak. Untuk masalah yang diberikan, saiz penimbal sebanyak satu sudah memadai.
func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string, 1) // buffer size of one for scanner.Scan() { line := scanner.Text() // Split the line on a space parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) // we're done sending to this channel now, so we close it. print(file1chan) }
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat \'Semua Goroutine Tidur - Kebuntuan\' dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!