2 回答

TA貢獻1775條經(jīng)驗 獲得超11個贊
在你的陳述之前,你實際上是在等待所有的goroutines回來。wg.Wait()
select
這樣做的問題是,我想在收到錯誤后立即返回錯誤
我假設(shè)您的意思是,一旦其中任何一個返回錯誤,就停止運行g(shù)oroutines。
在這種情況下,您可以使用來管理取消,但更好的是錯誤組。組
,它很好地結(jié)合了上下文功能和同步:context.Context
包錯誤組為處理常見任務(wù)的子任務(wù)的 goroutine 組提供同步、錯誤傳播和上下文取消。
特別是Group.Go
:
返回非 nil 錯誤的第一個調(diào)用將取消該組;其錯誤將由 Wait 返回。
import (
"sync"
"runtime"
"fmt"
"errors"
"golang.org/x/sync/errgroup"
)
func try() (bool, error) {
errg := new(errgroup.Group)
s := []int{0,1,2,3,4,5}
for i, val := range s {
i := i
val := val
errg.Go(func() error {
return func(i int, val int) error {
if i == 3 {
return errors.New("one error")
} else {
return nil
}
}(i, val)
})
}
if err := errg.Wait(); err != nil {
// handle error
}
return true, nil
}
https://play.golang.org/p/lSIIFJqXf0W

TA貢獻1839條經(jīng)驗 獲得超15個贊
我發(fā)現(xiàn)墳?zāi)箤Υ撕苡杏?。下面是一個精簡的非工作示例,它顯示了要點,而無需在循環(huán)中處理變量封裝之類的事情。它應(yīng)該給你這個想法,但我很樂意澄清任何一點。
package main
import (
"fmt"
"gopkg.in/tomb.v2"
"sync"
)
func main() {
ts := tomb.Tomb{}
s := []int{0,1,2,3,4,5}
for i, v := range s {
ts.Go(func() error {
// do some work here or return an error, make sure to watch the dying chan, if it closes,
//then one of the other go-routines failed.
select {
case <- ts.Dying():
return nil
case err := <- waitingForWork():
if err != nil {
return err
}
return nil
}
})
}
// If an error appears here, one of the go-routines must have failed
err := ts.Wait()
if err != nil {
fmt.Println(err)
}
}
- 2 回答
- 0 關(guān)注
- 91 瀏覽
添加回答
舉報