來看下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
中,來實現對使用errgroup
的ctx
啟動的goroutine
的取消操作。
// 啟動取消阻塞的goroutine
// 記錄第乙個出錯的goroutine的err資訊
func (g *group) go(f func() error)
})} }()
}
1、借助於waitgroup
實現對goroutine
阻塞;
2、通過sync.once
記錄下,第乙個出錯的goroutine
的錯誤資訊;
3、如果包裝了context
的cancelfunc
,在出錯的時候進行退出操作。
// 阻塞所有的通過go加入的goroutine,然後等待他們乙個個執行完成
// 然後返回第乙個出錯的goroutine的錯誤資訊
func (g *group) wait() error
return g.err
}
1、借助於waitgroup
實現對goroutine
阻塞;
2、如果包裝了context
的cancelfunc
,在出錯的時候進行退出操作;
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...