我需要启动大量goroutine,并等待其终止。直观的方法似乎是使用通道来等待所有操作完成:
package main type Object struct { //data } func (obj *Object) Update(channel chan int) { //update data channel <- 1 return } func main() { channel := make(chan int, n) list := make([]Object, n, m) for { for _, object := range list { go object.Update(channel) } for i := 0; i < n; i++ { <-channel } //now everything has been updated. start again } }
但是问题是对象的数量以及goroutine的数量可能会改变。是否可以更改通道的缓冲区大小?
也许有更优雅的方式做到这一点?
我已经使用WaitGroup作为此问题的解决方案。翻译您的当前代码,并附上一些日志,以明确正在发生的事情:
package main import "sync" import "fmt" import "time" type Object struct { //data } func (obj *Object) Update(wg *sync.WaitGroup) { //update data time.Sleep(time.Second) fmt.Println("Update done") wg.Done() return } func main() { var wg sync.WaitGroup list := make([]Object, 5) for { for _, object := range list { wg.Add(1) go object.Update(&wg) } //now everything has been updated. start again wg.Wait() fmt.Println("Group done") } }