




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第golang基于errgroup實現(xiàn)并發(fā)調(diào)用的方法目錄串行調(diào)用基于sync.WaitGroup實現(xiàn)簡單的并發(fā)調(diào)用基于errgroup.Group實現(xiàn)并發(fā)調(diào)用總結(jié)
串行調(diào)用
在用go編寫web/rpc服務(wù)器的時候,經(jīng)常會出現(xiàn)需要對下游多個/組服務(wù)調(diào)用rpc(或者其他比較耗時的操作)的情況。
按照自然的寫法,比如對下游有ABC三個調(diào)用,串行順著寫,就總共要花費TimeA+TimeB+TimeC的時間:
funcHandler(ctxcontext.Context){
vara,b,crespType
a=A(ctx)
b=B(ctx)
c=C(ctx)
基于sync.WaitGroup實現(xiàn)簡單的并發(fā)調(diào)用
但經(jīng)常地,幾個rpc相互之間沒有依賴關(guān)系的情況,這時,我們稍加思考就會想到使用并發(fā)的方式,同時發(fā)出請求,阻塞等到所有請求返回,這樣,總體耗時就變成了Max(TimeA,TimeB,TimeC),我們可以通過常用的sync.WaitGroup輕松實現(xiàn)這事:
funcHandler(ctxcontext.Context){
vara,b,crespType
wg:=sync.WaitGroup{}
wg.Add(3)
gofunc(){
deferwg.Done()
a=A(ctx)
gofunc(){
deferwg.Done()
b=B(ctx)
gofunc(){
deferwg.Done()
c=C(ctx)
wg.Wait()
但是現(xiàn)實事件是不完美的,尤其是在加入了網(wǎng)絡(luò)這一因素后,我們經(jīng)常會需要處理調(diào)用失敗的情況,很多情況下,并發(fā)的幾個操作只要任一失敗,整個處理就算失敗了,但是由于WaitGroup要等所有調(diào)用都done才能返回,因此調(diào)用時間是由耗時最長的那個(不一定是失敗的)決定的,如果不是失敗的那個,其實就產(chǎn)生了資源浪費,如下圖,B最先失敗了,此時邏輯上已經(jīng)可以返回,但是實際卻等到了最長的調(diào)用-A返回了整個函數(shù)才返回:
funcHandler(ctxcontext.Context){
vara,b,crespType
varerrA,errB,errCerror
wg:=sync.WaitGroup{}
wg.Add(3)
gofunc(){
deferwg.Done()
a,errA=A(ctx)
gofunc(){
deferwg.Done()
b,errB=B(ctx)
gofunc(){
deferwg.Done()
c,errC=C(ctx)
wg.Wait()
iferrA!=nil{
//...
iferrB!=nil{
//...
iferrC!=nil{
//...
基于errgroup.Group實現(xiàn)并發(fā)調(diào)用
這對于追求極致的我們來說顯然是不能接受的,我們希望達到,如果有任意一個調(diào)用報錯,立刻讓所有調(diào)用返回的效果:
好在,我們有現(xiàn)成的工具可以用,通過引入/x/sync/errgroup,可以輕松實現(xiàn)上面的目的。
為了使用errgroup,先使用WithContext方法創(chuàng)建一個Group
wg,groupCtx:=errgroup.WithContext(ctx)
返回的第一個參數(shù)是*errgroup.Group,第二個則是在子調(diào)用中應(yīng)該使用的context。
然后,使用Go方法調(diào)用所有的并發(fā)方法
wg.Go(func()error{
varerrerror
a,err=A(groupCtx)
returnerr
最后,使用Wait方法等待并發(fā)結(jié)束,返回值是所有子調(diào)用中第一個非nil的error,全成功的話就是nil。
iferr:=wg.Wait();err!=nil{
//...
因此整體,我們的代碼差不多就長這個樣子
funchandler(ctxcontext.Context){
vara,b,crespType
wg,groupCtx:=errgroup.WithContext(ctx)
wg.Go(func()error{
varerrerror
a,err=A(groupCtx)
returnerr
wg.Go(func()error{
varerrerror
b,err=B(groupCtx)
returnerr
wg.Go(func()error{
varerrerror
c,err=C(groupCtx)
returnerr
iferr:=wg.Wait();err!=nil{
//...錯誤處理
//全部成功
errgroup內(nèi)部通過封裝了waitGroup和sync.Once實現(xiàn)了這個語法糖。
使用時特別要注意的是,errgroup的提前取消調(diào)用rpc是通過cancel那個返回的context(即上面的groupCtx)實現(xiàn)的,因此在所有子調(diào)用中都要實現(xiàn)監(jiān)聽groupCtx的Done事件。而在正常的rpc框架中都已經(jīng)幫我們實現(xiàn)了這件事,因此我們只要保證傳進去的是groupCtx
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國ODF箱體數(shù)據(jù)監(jiān)測報告
- 2025年中國GF脲醛樹脂數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國食品廣口瓶市場分析及競爭策略研究報告
- 2025至2030年中國選色輪市場分析及競爭策略研究報告
- 2025至2030年中國蒸發(fā)箱外殼市場分析及競爭策略研究報告
- 2025至2030年中國美發(fā)工具包市場分析及競爭策略研究報告
- 2025至2030年中國磁力包式國際象棋五子棋兩用市場分析及競爭策略研究報告
- 2025至2030年中國電壓輸出操縱桿市場分析及競爭策略研究報告
- 2025至2030年中國炭疽福美可濕性粉市場分析及競爭策略研究報告
- 2025至2030年中國極壓機械油市場分析及競爭策略研究報告
- 2025年山東省威海市市屬事業(yè)單位招聘(綜合類)考試筆試高頻重點模擬試卷提升(共500題附帶答案詳解)
- 2025年高中歷史會考會考全套知識復(fù)習(xí)
- 特殊作業(yè)安全管理監(jiān)護人專項培訓(xùn)課件
- 科幻中的物理學(xué)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 安全、環(huán)境、職業(yè)健康安全目標(biāo)、指標(biāo)及管理方案
- 課件:《中華民族共同體概論》第一講 中華民族共同體基礎(chǔ)理論
- 中國人民抗日戰(zhàn)爭勝利紀(jì)念日紀(jì)念暨世界反法西斯戰(zhàn)爭勝利課件
- 殯葬禮儀策劃方案
- 行政效能提升路徑研究
- (完整版)無菌醫(yī)療器械耗材生產(chǎn)企業(yè)體系文件-質(zhì)量手冊模板
- JBT 3300-2024 平衡重式叉車 整機試驗方法(正式版)
評論
0/150
提交評論