Stellen Sie sich den folgenden Code ein:Sind goroutines Müll zusammen mit ihren Kanälen gesammelt?
func waitForOneOfTwoProcesses() {
c := make(chan bool)
go func() {
time.Sleep(1 * time.Second)
c<-true
}()
go func() {
time.Sleep(2 * time.Second)
c<-true
}()
<-c
}
dies einen Kanal und einen goroutine austritt oder erkennen, geht das c
und die goroutine verlassen kann weg ist?
Wäre die Antwort anders, wenn der Kanal eine Puffergröße von 2 hat?
Also das Schreiben in die Kanalblöcke, obwohl der Kanal außerhalb des Gültigkeitsbereichs und kann nie wieder gelesen werden. Ich frage mich, ob das ein Fehler oder eine Funktion ist. – AndreKR
Ja, Senden wird blockiert, obwohl kein Empfänger vorhanden ist. Die Laufzeitumgebung könnte so geschrieben werden, dass sie erkennt, wenn die Anwendung in diesem speziellen Beispiel den Empfang auf einem Kanal beendet hat. Die Laufzeitumgebung kann diese Laufzeitumgebung jedoch nicht erkennen. –
Als Hinweis, gibt es auch eine "non-blocking send", die genau dieses Problem löst - Sie würden den Puffer auf den Kanal auf 1 setzen und jeder würde ohne zu blockieren senden. Ausführlich beschrieben hier: https://blog.golang.org/go-concurrency-patterns-timing-out-and –