我想运行多个 goroutine,进行一些处理,将结果放入 channel ,当至少有一个 goroutine 完成时,完成所有其他 goroutine 并从 channel 返回结果。
所以,我尝试使用 WaitGroup 来实现它,但似乎我没有正确使用 WaitGroup 。
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 - 如何在完成一个 goroutine 后完成所有 goroutine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50408049/