Wait result of multiple goroutines

前端 未结 3 1737
走了就别回头了
走了就别回头了 2021-01-11 21:01

I am searching a way to execute asynchronously two functions in go which returns different results and errors, wait for them to finish and print both results. Also if one of

3条回答
  •  逝去的感伤
    2021-01-11 21:43

    You should create two channels for errors and results, then first read errors if no erorrs then read the results, this sample should works for your use case:

    package main
    
    import (
        "errors"
        "sync"
    )
    
    func test(i int) (int, error) {
        if i > 2 {
            return 0, errors.New("test error")
        }
        return i + 5, nil
    }
    
    func test2(i int) (int, error) {
        if i > 3 {
            return 0, errors.New("test2 error")
        }
        return i + 7, nil
    }
    
    func main() {
        results := make(chan int, 2)
        errors := make(chan error, 2)
        var wg sync.WaitGroup
        wg.Add(1)
        go func() {
            defer wg.Done()
            result, err := test(3)
            if err != nil {
                errors <- err
                return
            }
            results <- result
        }()
        wg.Add(1)
        go func() {
            defer wg.Done()
            result, err := test2(3)
            if err != nil {
                errors <- err
                return
            }
            results <- result
        }()
    
        // here we wait in other goroutine to all jobs done and close the channels
        go func() {
            wg.Wait()
            close(results)
            close(errors)
        }()
        for err := range errors {
            // here error happend u could exit your caller function
            println(err.Error())
            return
    
        }
        for res := range results {
            println("--------- ", res, " ------------")
        }
    }
    

提交回复
热议问题