Heim > Backend-Entwicklung > Golang > Wie schließe ich einen Kanal unbekannter Länge in Go sicher?

Wie schließe ich einen Kanal unbekannter Länge in Go sicher?

Patricia Arquette
Freigeben: 2024-12-23 17:44:14
Original
485 Leute haben es durchsucht

How to Safely Close a Channel of Unknown Length in Go?

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)
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage