currentid
должен быть self.currentid
, поскольку это переменная класса.
По умолчанию a chan
не содержит никаких элементов, поэтому все процедуры go блокируются при отправке до тех пор, пока что-то из них не будет считано. На самом деле они никогда не достигают утверждения wg.Done()
.
Решением было бы закрыть канал в своей собственной рутине. Оберните ваши строки wg.Wait()
и close(ch)
следующим образом:
go func() {
wg.Wait() //wait for all go routines to complete
close(ch) // closing channel after completion of wait fo go routines
}()
Затем вы можете выполнить диапазон по каналу, который закроется только после того, как все подпрограммы отправки завершены (и неявно все значения получено).
Я думаю, что у вашего исходного кода есть некоторые проблемы.
Мое решение состояло бы в том, чтобы порождать новую программу, чтобы отслеживать, закончили ли эти 10 операций. Там вы будете использовать свой WaitGroup
.
Тогда код будет выглядеть так:
package main
import (
"fmt"
"runtime"
"sync"
)
var wg sync.WaitGroup
func main() {
ch := make(chan int, 10)
for i := 0; i < 10; i++ { // creates 10 go routines and adds to waitgroup
wg.Add(1)
go func() {
for j := 0; j < 10; j++ {
ch <- j
}
wg.Done() // indication of go routine is done to main routine
}()
}
go func(){
wg.Wait()
close(ch)
}()
fmt.Println(runtime.NumGoroutine())
for v := range ch { // range can be used since channel is closed
fmt.Println(v)
}
fmt.Println("About to exit program ...")
}