go中errgroup原始碼解讀

2022-06-22 10:33:07 字數 2606 閱讀 5313

來看下errgroup的實現

func main() )

eg.go(func() error )

if err := eg.wait(); err != nil

}

模擬於waitgroup,errgroup增加了乙個對goroutine錯誤收集的作用。

不過需要注意的是:

errgroup返回的第乙個出錯的goroutine丟擲的err

errgroup中還可以加入context

func main() )

eg.go(func() error )

if err := eg.wait(); err != nil

}func test1(ctx context.context) error

**很簡單

type group struct
還是在waitgroup的基礎上實現的

// 返回乙個被context.withcancel重新包裝的ctx

func withcontext(ctx context.context) (*group, context.context) , ctx

}

裡面使用了context,通過context.withcancel對傳入的context進行了包裝

withcancel函式返回的cancelfunc被呼叫或者是父節點的done channel被關閉(父節點的 cancelfunc 被呼叫),此 context(子節點)的done channel也會被關閉。

errgroup把返回的cancelfunc包進了自己的cancel中,來實現對使用errgroupctx啟動的goroutine的取消操作。

// 啟動取消阻塞的goroutine

// 記錄第乙個出錯的goroutine的err資訊

func (g *group) go(f func() error)

})} }()

}

1、借助於waitgroup實現對goroutine阻塞;

2、通過sync.once記錄下,第乙個出錯的goroutine的錯誤資訊;

3、如果包裝了contextcancelfunc,在出錯的時候進行退出操作。

// 阻塞所有的通過go加入的goroutine,然後等待他們乙個個執行完成

// 然後返回第乙個出錯的goroutine的錯誤資訊

func (g *group) wait() error

return g.err

}

1、借助於waitgroup實現對goroutine阻塞;

2、如果包裝了contextcancelfunc,在出錯的時候進行退出操作;

3、丟擲第乙個出錯的goroutine的錯誤資訊。

不過工作中發現乙個errgroup錯誤使用的例子

func main() 

var err error

eg.go(func() error )

eg.go(func() error )

if err = eg.wait(); err != nil

}func test1() error

很明顯err被資源競爭了

$ go run -race main.go 

***************===

warning: data race

write at 0x00c0000801f0 by goroutine 8:

main.main.func2()

/users/yj/go/src/go-point/sync/errgroup/main.go:23 +0x97

...

errgroup相比比較簡單,不過需要先弄明白waitgroup,context以及sync.once,主要是借助這幾個元件來實現的。

errgroup可以帶攜帶context,如果包裝了context,會使用context.withcancel進行超時,取消或者一些異常的情況

azkaban web server原始碼解析

azkaban主要用於hadoop相關job任務的排程,但也可以應用任何需要排程管理的任務,可以完全代替crontab。azkaban主要分為web server 任務上傳,管理,排程 executor server 接受web server的排程指令,進行任務執行 1.資料表 projects 工...

JDK LinkedHashMap原始碼解析

今天來分析一下jdk linkedhashmap的源 public class linkedhashmapextends hashmapimplements map可以看到,linkedhashmap繼承自hashmap,並且也實現了map介面,所以linkedhashmap沿用了hashmap的大...

Redux原始碼createStore解讀常用方法

const store createstore reducer,preloadedstate enhancer 直接返回當前currentstate,獲取state值,return state 我覺得應該深轉殖乙個新的物件返回,不然有可能會被外部修改 function getstate consol...