скажем, я хочу запустить группу горутин и дождаться их завершения (например, возврата). Я могу придумать какое-то решение на основе канала (например, создать канал и прослушать его, подсчитывая полученные сообщения, которые должны быть отправлены каждой из горутин, и выйти после получения соответствующего количества сообщений), но, возможно, есть более элегантное/эффективное решение, потому что этот случай кажется очень распространенным.
Как дождаться группы горутин?
Ответы (1)
Да; вам нужен *sync.WaitGroup
, который вы можете использовать, вызывая waitGroup.Add(1)
перед запуском каждой задачи, waitGroup.Done()
когда он заканчивается, и waitGroup.Wait()
как только вы все начали и хотите дождаться завершения, вот так а>:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
wg := new(sync.WaitGroup)
for i := 1; i < 3; i++ {
wg.Add(1)
go func(i int) { // ensures each run gets distinct i
fmt.Println("Sleeping", i, "seconds")
time.Sleep(time.Duration(i) * time.Second)
fmt.Println("Slept", i, "seconds")
wg.Done()
}(i)
}
wg.Wait()
fmt.Println("All done")
}
person
twotwotwo
schedule
29.12.2015
sync.WaitGroup
- person Tim Cooper   schedule 29.12.2015