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

标签 go

我想运行多个 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/

相关文章:

google-app-engine - 在 Go 中部署到 Google App Engine Standard 时如何获取 RemoteAddr(远程 IP 地址)

go - 如何在golang中查找sshd服务状态

string - 如何索引 Golang 字符串中的字符?

garbage-collection - 有没有一种安全的方法可以使用 CGo 从 C 代码中保留对 Go 变量的引用?

python - 在 Go 中将 C 和 Python 代码串在一起?

go - 使用 golang 以与 openssl genrsa 相同的方式获取 RSA key

go - 在 Go 函数内部定义的常量与在包顶部定义的常量之间有区别吗?

go - 如何处理可以无阻塞增长的队列

python - 在函数之外的 golang 中设置常量,就像在 Python 中一样

go - 当客户端关闭连接时,grpc 转到 : how to know in server side,