Ich bin neu in Go. Wenn ich die zweite Goroutine auskommentiere, gibt es einen fatalen Fehler. Ich verstehe nicht, was diesen Fehler verursacht. Kannst du es mir erklären?Deadlock zwischen goroutines
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int)
go func() {
for i := 0; i < 10; i++ {
ch <- i
}
}()
// go func() {
for {
if num, ok := <-ch; !ok {
break
} else {
fmt.Printf("%d\n", num)
}
}
// }()
time.Sleep(2 * time.Second)
close(ch)
}
Dieser druckt den folgenden Code:
0
1
2
3
4
5
6
7
8
9
fatal error: all goroutines are asleep - deadlock!
goroutine 1 [chan receive]:
main.main()
/tmp/sandbox169127128/main.go:17 +0xa0
Program exited.
Danke für die kurze Erläuterung, Cerise. Ich bin mir nicht sicher, ob ich die Idee des "Blockierens" vollständig verstehe. Bedeutet dies, dass die empfangende Schleife für immer hängen bleibt? Ist das so, weil das ok auf der linken Seite des Codes unten wahr wird, aber es wird niemals eine andere Zahl geben? wenn num, ok: = <-ch; ! ok – Pizzas
@Puzzas: https://en.wikipedia.org/wiki/Blocking_(computing) In deinem Fall ist 'num, ok: = <-ch 'blockiert (wartet auf eine weitere Antwort). Diese andere Antwort kommt nie, weil die sendende Routine bereits beendet wurde. Wenn Sie den Kanal in der Send-Go-Routine schließen, wird eine weitere Antwort (die anzeigt, dass der Kanal geschlossen wurde) empfangen. – Flimzy
@Pizzas Empfangen auf einem offenen Kanal wartet auf einen Wert, der an den Kanal gesendet wird. Die Empfangsschleife wartet für immer, nachdem alle Werte von der sendenden goroutine empfangen worden sind. –