der Verwendung habe ich einige Probleme mit dem folgenden Code:Der beste Weg sync.WaitGroup mit externer Funktion
package main
import (
"fmt"
"sync"
)
// This program should go to 11, but sometimes it only prints 1 to 10.
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() //deadlock here
}
// Print prints all numbers sent on the channel.
// The function returns when the channel is closed.
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()
}
ich einen toten Punkt an der angegebenen Stelle zu bekommen. Ich habe versucht, wg.Add(1)
anstelle von 2 und es löst mein Problem. Meine Überzeugung ist, dass ich den Kanal nicht erfolgreich als Argument an die Printer
Funktion senden kann. Gibt es eine Möglichkeit, das zu tun? Andernfalls wird eine Lösung für mein Problem Ersetzen der go Print(ch, wg)
Linie mit:
go func() {
Print(ch)
defer wg.Done()
}
und Ändern der Printer
Funktion:
func Print(ch <-chan int) {
for n := range ch { // reads from channel until it's closed
fmt.Println(n)
}
}
Was ist die beste Lösung?
Verstanden, ich wusste nicht, dass Sie die Adresse erforderlich zu sein gesendet an 'Print' anstelle der' WaitGroup' selbst. Ich stimme zu, dass die Methode nicht über die 'WaitGroup' wissen muss, aber nehme an, dass ich das trotzdem möchte. Was macht der Stern dann? Wählt es die ACTUAL 'WaitGrooup' aus, die ich in' main' definiert habe? Und warum ist das nicht eine Kopie? – Sahand
Die '* sync.WaitGroup' teilt dem Compiler mit, dass Sie einen Zeiger auf eine' WaitGroup' anstelle einer 'WaitGroup' wünschen. Der Compiler erwartet also, dass Sie die Methode aufrufen, indem Sie ihr eine Adresse geben, also das '& wg'. – Elwinar
Denken Sie nicht, dass Sie die Warteliste von print löschen können, da mains wg.Wait durchfallen kann, bevor der letzte Wert gedruckt wird, wenn Sie nur auf den Abschluss des Absenders gewartet haben. Auch kein Grund, eine Funktion mit einer Verschiebung zu beenden wg.Done(), im Grunde bedeutet, bedeutet, führen Sie dies am Ende. Drop the defer –