我正在从我的驱动程序代码中生成 5 个工作池,并从工作池返回错误。在我的主要任务中,我有另一个 go routine(go routine A ,在那个 go routine 之上添加了注释)监听错误。但是当从我的错误通道中选取数据时,我的 defer 语句正在执行。但我仍然可以看到来自 go routine A 的日志。
func ....{
var requests []Req
err := json.Unmarshal(Data, &requests)
if err != nil {
log.WithError(err).Errorf("Invalid data passed for flag type %v", proto.CreateFlagReq_SET_OF.String())
return err
}
f.Manager.TaskChan = make(chan Req, 100)
f.Manager.ErrorChan = make(chan error, 100)
for i := 0; i < f.Manager.WorkerCount; i++ {
f.Manager.Wg.Add(1)
//AddToSetOfcustomers just validates before addigg to redis
go f.Manager.Work(ctx, f.redisPool.AddToSetOfcustomers, i)
}
for _, request := range requests {
f.Manager.TaskChan <- request
}
close(f.Manager.TaskChan)
var errors error
**//go routine A**
go func() {
for {
select {
case err ,ok:= <- f.Manager.ErrorChan:
if ok{
errors = multierror.Append(errors, err)
log.Errorf("got erro1r %v",errors)
}else{
log.Info("returning")
return
}
}
}
}()
f.Manager.Wg.Wait()
defer log.Errorf("blhgsgh %v %v",len(f.Manager.ErrorChan),errors)
return errors
}
我有点怀疑 defer 被执行了,然后我的主要 go 例程完成了,然后 return 被执行了,但是我能做些什么来传播我在返回之前从 multiErrors 附加的错误?
如果我尝试使用通道同步 go routine A 和我的主要 go routine(我称之为 defer 的那个),它会变成阻塞。Help appretiated
千巷猫影
相关分类