我定义了一个Cycle类来处理并发任务.我想要的是运行两个函数,每个函数都在Goroutine中,等待它们的完成,并将它们的输出错误组合在一起.但我只有一个错误.每种方法的责任如下:
Run
-在Goroutine中运行函数,并收集其错误
WaitAllDone
-将所有功能错误合并在一起,并等待所有功能完成
Do1, Do2
-测试功能
import (
"fmt"
"go.uber.org/multierr"
"sync"
"testing"
)
type Cycle struct {
errChan chan error
wg sync.WaitGroup
}
func NewCycle() *Cycle {
return &Cycle{
errChan: make(chan error),
wg: sync.WaitGroup{},
}
}
// run fn and collect its error into error channel
func (c *Cycle) Run(fn func() error) {
c.wg.Add(1)
go func() {
defer c.wg.Done()
if err := fn(); err != nil {
c.errChan <- err
}
}()
}
// wait all fn finish and combine their error together
func (c *Cycle) WaitAllDone() error {
var err error
go func() {
for {
if tmpErr, ok := <-c.errChan; ok {
err = multierr.Append(err, tmpErr)
} else{
break
}
}
}()
c.wg.Wait()
close(c.errChan)
return err
}
func Do1() error {
return fmt.Errorf("ERR1")
}
func Do2() error {
return fmt.Errorf("ERR2")
}
func Test41(t *testing.T) {
c := NewCycle()
c.Run(Do1)
c.Run(Do2)
if err := c.WaitAllDone(); err != nil {
t.Log(err)
}
}
最后的t.Log(err)
输出ERR1
或ERR2
,但我希望它输出ERR1 ERR2
.为什么它漏掉了一个错误.