Ho alcuni problemi con il seguente codice:miglior modo di usare sync.WaitGroup con funzione esterna
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()
}
ottengo una situazione di stallo nel luogo specificato. Ho provato a impostare wg.Add(1)
invece di 2 e risolve il mio problema. La mia convinzione è che non sto inviando il canale come argomento alla funzione Printer
. C'è un modo per farlo? In caso contrario, una soluzione al mio problema sta sostituendo la linea go Print(ch, wg)
con:
go func() {
Print(ch)
defer wg.Done()
}
e modifica della funzione Printer
a:
func Print(ch <-chan int) {
for n := range ch { // reads from channel until it's closed
fmt.Println(n)
}
}
Qual è la soluzione migliore?
capito, non ho conosciuto che avete l'indirizzo di essere inviato a 'Print' invece che al' WaitGroup' stesso. Sono d'accordo che il metodo non ha bisogno di conoscere il 'WaitGroup', ma supponiamo che lo voglio comunque. Cosa fa allora la stella? Seleziona l'ATTUALE 'WaitGrooup' che ho definito in' main'? E perché questo non è una copia? – Sahand
Il '* sync.WaitGroup' dice al compilatore che vuoi un puntatore a un' WaitGroup' invece di un 'WaitGroup'. Quindi il compilatore si aspetta che tu chiami il metodo dandogli un indirizzo, quindi '& wg'. – Elwinar
Non pensare di poter rimuovere il waitgroup di stampa come wg principale. L'attesa potrebbe passare prima che venga stampato l'ultimo valore se si è solo aspettato il completamento del mittente. Inoltre, non c'è motivo per terminare una funzione con un defero wg.Done(), differire sostanzialmente significa, eseguirlo alla fine. rilascia il differimento –