【发布时间】:2023-04-03 00:40:01
【问题描述】:
我想运行多个goroutine,进行一些处理,将结果放入channel,当至少有一个goroutine完成时,完成所有其他goroutine并从channel返回结果。
所以,我尝试使用等待组来实现这一点,但似乎我没有正确使用等待组。
package optimizer
import (
"github.com/tevino/abool"
"errors"
"sync"
"runtime"
"log"
)
type Optimizer struct {
Handlers []ofdHandler.Handler
}
func Make(handlers []ofdHandler.Handler, maxProcs int) Optimizer {
runtime.GOMAXPROCS(maxProcs)
return Optimizer{Handlers: handlers}
}
func (o Optimizer) Optimize(params operations.GetV1ReceiptsParams) (*models.Receipt, error) {
var wg sync.WaitGroup
wg.Add(len(o.Handlers))
results := make(chan *models.Receipt)
isCalculated := abool.NewBool(false)
for _, handler := range o.Handlers {
go func(handler ofdHandler.Handler) {
log.Println("Starting handler: ", handler.GetName())
defer wg.Done()
if isCalculated.IsSet() {
log.Println("Result is calculated, exiting goroutine...")
return
}
receipt, err := handler.Handle(params)
if err != nil {
log.Println(err)
return
}
if isCalculated.IsSet() {
log.Println("Result is calculated, exiting goroutine...")
return
}
log.Println("Writing result to channel...")
isCalculated.Set()
results <- receipt
}(handler)
}
log.Println("Waiting...")
wg.Wait()
if receipt, ok := <-results; ok {
return receipt, nil
}
return nil, errors.New("couldn't optimize with current list of Handlers")
}
【问题讨论】:
标签: go