Heim >Backend-Entwicklung >Golang >Wie schließe ich einen Kanal unbekannter Länge in Go sicher?
Schließen eines Kanals unbekannter Länge
Im bereitgestellten Code tritt der Fehler „Auf geschlossenem Kanal senden“ auf, weil mehrere Goroutinen versuchen zu senden Werte auf einem Kanal, der bereits geschlossen wurde. Dieses Problem entsteht durch die mangelnde Synchronisierung zwischen den Goroutinen, da eine Goroutine den Kanal schließt, während andere noch Daten senden.
Um einen Kanal in dieser Situation effektiv zu schließen, ist es wichtig zu bestimmen, wann alle Sender-Goroutinen dies getan haben haben ihre Aufgaben erledigt. Dies kann mithilfe einer sync.WaitGroup erreicht werden, um zu erkennen, wann alle Sender-Goroutinen mit dem Senden von Werten fertig sind.
Hier ist der geänderte Code, der eine sync.WaitGroup verwendet:
func gen(ch chan int, wg *sync.WaitGroup) { defer wg.Done() var i int for { time.Sleep(time.Millisecond * 10) ch <- i i++ // when no more data (e.g. from db, or event stream) if i > 100 { break } } } func receiver(ch chan int) { for i := range ch { fmt.Println("received:", i) } } func main() { ch := make(chan int) wg := &sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go gen(ch, wg) } go func() { wg.Wait() close(ch) }() receiver(ch) }
In dieser Lösung Jede Sender-Goroutine fügt einen zur sync.WaitGroup hinzu, um anzugeben, dass sie Werte auf dem Kanal senden wird. Das wg.Wait() in der Goroutine close() stellt sicher, dass der Kanal erst geschlossen wird, nachdem alle Sender-Goroutinen ihre Aufgaben abgeschlossen haben, und verhindert so den Fehler „Senden bei geschlossenem Kanal“.
Das obige ist der detaillierte Inhalt vonWie schließe ich einen Kanal unbekannter Länge in Go sicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!