如何解决在Go中使用WaitGroup和通道
我正在使用Go进行货运服务,该服务调用了许多Web服务,但是我不确定如何实现并发模型。这种方法只是有效,但有时会锁定。我相信渠道和WaitGroup会有一些问题。我真的需要使用WaitGroups或仅通道是例程锁定的专用对象。
// Call carriers quote webservice
var wg sync.WaitGroup
error := make(chan error)
quote := make(chan []freight.Quote)
for _,c := range carriers {
go c.Quote(&wg,obj,quote,error)
}
wg.Wait()
// Collect the results
quotes:= make([]freight.Quote,0)
for i := 1; i < len(carriers); i++ {
err := <-error
quoteAws:= <-quote
if err != nil {
log.Println(err)
}
if quoteAws != nil {
quotes= append(quotes,quoteAws...)
}
}
close(error)
close(quote)
func (carrier CarrierA) Quote(wg *sync.WaitGroup,obj Volume,quotes chan []Quote,err chan error)
{
// Deal with waitgroup
wg.Add(1)
defer wg.Done()
// Quote the freigth
err <- nil
quotes <- quotesResult
return
}
解决方法
使用切片来收集错误和引号。使用等待组等待goroutine完成。
errs := make([]error,len(carriers))
quotes := make([]freight.Quote,len(carriers))
var wg sync.WaitGroup
for i,c := range carriers {
wg.Add(1)
go func(i int,c Carrier) {
defer wg.Done()
quotes[i],errs[i] = c.Quote(args)
}(i,c)
}
wg.Wait()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。