Heim > Backend-Entwicklung > Golang > Warum führt die Verwendung einer Kopie von Sync.WaitGroup in einer externen Funktion dazu, dass die Ausgabe in einer Goroutine fehlt?

Warum führt die Verwendung einer Kopie von Sync.WaitGroup in einer externen Funktion dazu, dass die Ausgabe in einer Goroutine fehlt?

Mary-Kate Olsen
Freigeben: 2024-11-06 14:00:03
Original
565 Leute haben es durchsucht

Why does using a copy of Sync.WaitGroup in an external function lead to missing output in a goroutine?

Verwenden von Sync.WaitGroup mit externen Funktionen

Im bereitgestellten Code soll die primäre Goroutine Zahlen von 1 bis 11 unter Verwendung eines Kanals und eines drucken Wartegruppe. Gelegentlich wird jedoch Nummer 11 übersprungen, was zu einer unvollständigen Ausgabe führt.

Das Problem entsteht durch die falsche Zuordnung von sync.WaitGroup zur externen Funktion Print. Durch die Übergabe einer Kopie von WaitGroup an die Funktion kann sie den erforderlichen Done()-Aufruf nicht für die ursprüngliche Wartegruppe ausführen, auf die die Haupt-Goroutine wartet.

Beste Lösung:

Die empfohlene Lösung besteht darin, den Code wie folgt zu ändern:

<code class="go">func main() {
    ch := make(chan int)

    var wg sync.WaitGroup
    wg.Add(2)

    go Print(ch, &wg)

    go func() {
        for i := 1; i <= 11; i++ {
            ch <- i
        }
        close(ch)
        defer wg.Done()
    }()

    wg.Wait()
}

func Print(ch <-chan int, wg *sync.WaitGroup) {
    for n := range ch { // reads from channel until it's closed
        fmt.Println(n)
    }
    defer wg.Done()
}</code>
Nach dem Login kopieren

In diesem Fix erhält die Print-Funktion einen Zeiger auf die Wartegruppe und stellt so sicher, dass ihre Done()-Methode innerhalb der aufgerufen wird Funktion, wodurch die Haupt-Goroutine korrekt ausgeführt werden kann.

Alternative Lösung:

Alternativ kann man die Notwendigkeit von WaitGroup innerhalb der Print-Funktion eliminieren, indem man den Kanal direkt schließt nach dem Senden aller Nummern:

<code class="go">func Print(ch <-chan int) {
    for n := range ch { // reads from channel until it's closed
        fmt.Println(n)
    }
}</code>
Nach dem Login kopieren

In diesem Fall muss die Haupt-Goroutine stattdessen auf die Schließung des Kanals warten:

<code class="go">wg.Wait()
close(ch)</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung einer Kopie von Sync.WaitGroup in einer externen Funktion dazu, dass die Ausgabe in einer Goroutine fehlt?. 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