// 计数加一
group.Add(1)
go func(cmd string) {
result := doCmd(cmd)
atomic.AddUint64(&count, 1)
lock.Lock()
results = append(results, result)
lock.Unlock()
// 计数减一
group.Done()
}(item)
}
// 阻塞
group.Wait()
fmt.Printf("count=%d n", count) // 10000
return
}
group本质大概是一个计数器,计数 > 0时, group.Wait() 会阻塞,直到 计数 == 0. 这里还有一点要注意,就是 results = append(results, result) 的操作是线程不安全的,清楚这里 results 是共享的,需要加锁来保证同步,否则最后 len(results) 不为 10000。
我们建一个BenchCmd, 来存放 cmds. 如下:
type BenchCmd struct {
cmds []Cmd
waitGroup sync.WaitGroup
errs []error
lock sync.Mutex
}
func (b *BenchCmd) doCmds() {
for _, item := range b.cmds {
b.waitGroup.Add(1)
go func(cmd Cmd) {
cmd.parse()
err := cmd.doOps()
b.lock.Lock()
b.errs = append(b.errs, err)
b.lock.Unlock()
b.waitGroup.Done()
}(item)
}
b.waitGroup.Wait()
}
最后的调用就像这样:
var cmds []Cmd
cmd_a := Cmd{`file/test.png|thumbnail/x300|blur/20x8`, "test_a.png", nil, nil}
cmd_b := Cmd{`file/test.png|thumbnail/500x1000|blur/20x108`, "test_b.png", nil, nil}
cmd_c := Cmd{`file/test.png|thumbnail/300x300`, "test_c.png", nil, nil}









