gpt4 book ai didi

go - 如何在完成一个 goroutine 后完成所有 goroutine

转载 作者:IT王子 更新时间:2023-10-29 02:31:42 32 4
gpt4 key购买 nike

我想运行多个 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")
}

最佳答案

最好的方法是使用 context .在 Go blog 上有一个很好的示例,说明如何针对您的问题类型执行此操作。 .

关于go - 如何在完成一个 goroutine 后完成所有 goroutine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50408049/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com