GO隨想:GO的并發等待

協程并發等待技術——WaitGroup 類型和 errgroup 包

waitgroup?

阻塞等待多個并發任務執行完成。WaitGroup 類型主要包含下面幾個方法。

func (wg *WaitGroup) Add(delta int)
func (wg *WaitGroup) Done()
func (wg *WaitGroup) Wait()

第一個是 Add 方法,在任務運行之前,需要調用 Add 方法,用于設置需要等待完成的任務數,Add 方法傳進去的數值之和,需要和任務數相等。

第二個是 Done 方法,每個任務完成時,需要調用 Done 方法,用于告知 WaitGroup 對象已經有一個任務運行完成。

第三個是 Wait 方法,當需要等待所有并發任務完成時,調用 Wait 方法,用于阻塞主協程。

?

import ("sync"
)var urls = []string{"http://www.golang.org/","http://www.google.com/","http://www.somestupidname.com/",
}func TestWaitGroup(t *testing.T) {// 創建WaitGroupwg := sync.WaitGroup{}results := make([]string, len(urls))for index, url := range urls {url := urlindex := index// 在創建協程執行任務之前,調用Add方法wg.Add(1)go func() {// 任務完成后,調用Done方法defer wg.Done()// Fetch the URL.resp, err := http.Get(url)if err != nil {return}defer resp.Body.Close()body, err := io.ReadAll(resp.Body)if err != nil {return}results[index] = string(body)}()}// 主協程阻塞,等待所有的任務執行完成wg.Wait()
}

errgroup 包

可以在主協程中獲取并發任務錯誤信息?

import ("golang.org/x/sync/errgroup"
)func TestErrHandle(t *testing.T) {results := make([]string, len(urls))// 創建Group類型g := new(errgroup.Group)for index, url := range urls {// Launch a goroutine to fetch the URL.url := urlindex := index// 調用Go方法g.Go(func() error {// Fetch the URL.resp, err := http.Get(url)if err != nil {return err // 返回錯誤}defer resp.Body.Close()body, err := io.ReadAll(resp.Body)if err != nil {return err // 返回錯誤}results[index] = string(body)return nil})}// Wait for all HTTP fetches to complete.// 等待所有任務執行完成,并對錯誤進行處理if err := g.Wait(); err != nil {fmt.Println("Failured fetched all URLs.")}
}

?第一步,我們要創建 Group 類型的對象。

第二步,在 Group 的 Go 方法中傳入那些需要并發運行的函數。特別需要注意的是,這些傳入的函數必須將錯誤返回。

第三步,也是最后一步,在主協程中,我們需要調用 Group 對象的 Wait 方法。通過這一調用,主協程將會阻塞等待,直至所有通過 Go 方法傳入的任務都執行完畢。并且,在任務完成后,我們還能夠對 Wait 方法所返回的錯誤進行處理。

func TestLimitGNum(t *testing.T) {results := make([]string, len(urls))// 用WithContext函數創建Group對象eg, ctx := errgroup.WithContext(context.Background())// 調用SetLimit方法,設置可同時運行的最大協程數eg.SetLimit(2)for index, url := range urls {url := urlindex := index// 調用Go方法eg.Go(func() error {select {case <-ctx.Done(): // select-done模式取消運行return errors.New("task is cancelled")default:// 并發獲取urlresp, err := http.Get(url)if err != nil {return err // 返回錯誤}defer resp.Body.Close()body, err := io.ReadAll(resp.Body)if err != nil {return err // 返回錯誤}results[index] = string(body)return nil}})}// 等待所有任務執行完成,并對錯誤進行處理if err := eg.Wait(); err != nil {fmt.Println("Failured fetched all URLs.")}
}

?errorGroup 包中的結構體

type token struct{}type Group struct {cancel func(error) // 這個作用是為了前面說的 WithContext 而來的wg sync.WaitGroup // errGroup底層的阻塞等待功能,就是通過WaitGroup實現的sem chan token // 用于控制最大運行的協程數err     error // 最后在Wait方法中返回的errorerrOnce sync.Once // 用于安全的設置err
}

總結:

1. WaitGroup類型是Golang的基礎并發類型,用于阻塞等待多個并發任務執行完成,包含Add、Done和Wait方法。

2. errgroup包是Golang提供的并發擴展庫,對WaitGroup進行了封裝,在并發等待的基礎功能上提供了錯誤處理和任務取消功能。

3. Group類型的Go方法用于傳入具有錯誤返回值的函數類型,Wait方法會阻塞等待所有傳入Go方法的函數全部運行完畢,并且在任務完成后能夠對錯誤進行處理。

4. 任務取消功能通過WithContext函數創建Group對象,傳入Go方法的函數需要實現select-done模式,利用context來停止所有相關任務。

5. errgroup包還可以限制同時并發運行的最大協程數,通過SetLimit方法設置可同時運行的最大協程數,達到最大協程數時會阻塞創建新協程運行任務。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/65275.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/65275.shtml
英文地址,請注明出處:http://en.pswp.cn/web/65275.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解Mybatis原理》MyBatis的sqlSessi

sqlSessionFactory 與 SqlSession 正如其名&#xff0c;Sqlsession對應著一次數據庫會話。由于數據庫會話不是永久的&#xff0c;因此Sqlsession的生命周期也不應該是永久的&#xff0c;相反&#xff0c;在你每次訪問數據庫時都需要創建它&#xff08;當然并不是說在Sqlsession…

《HarmonyOS第一課》煥新升級,賦能開發者快速掌握鴻蒙應用開發

隨著HarmonyOS NEXT發布&#xff0c;鴻蒙生態日益壯大&#xff0c;廣大開發者對于系統化學習平臺和課程的需求愈發強烈。近日&#xff0c;華為精心打造的《HarmonyOS第一課》全新上線&#xff0c;集“學、練、考”于一體&#xff0c;憑借多維融合的教學模式與系統課程設置&…

springboot集成整合工作流,activiti審批流,整合實際案例,流程圖設計,流程自定義,表單配置自定義,代碼demo流程

前言 activiti工作流引擎項目&#xff0c;企業erp、oa、hr、crm等企事業辦公系統輕松落地&#xff0c;一套完整并且實際運用在多套項目中的案例&#xff0c;滿足日常業務流程審批需求。 一、項目形式 springbootvueactiviti集成了activiti在線編輯器&#xff0c;流行的前后端…

《探秘計算機視覺與深度學習:開啟智能視覺新時代》

《探秘計算機視覺與深度學習&#xff1a;開啟智能視覺新時代》 一、追溯起源&#xff1a;從萌芽到嶄露頭角二、核心技術&#xff1a;解鎖智能視覺的密碼&#xff08;一&#xff09;卷積神經網絡&#xff08;CNN&#xff09;&#xff1a;圖像識別的利器&#xff08;二&#xff0…

設計模式-結構型-適配器模式

在軟件開發中&#xff0c;隨著系統的不斷擴展和模塊的不斷增加&#xff0c;往往會遇到不同模塊之間接口不兼容的情況。此時&#xff0c;如果我們能通過某種方式將一個接口轉化為另一個接口&#xff0c;那么開發工作將變得更加靈活和高效。適配器模式&#xff08;Adapter Patter…

Vmware安裝centos

用來記錄自己安裝的過程 一、創建虛擬機安裝centos鏡像 點擊完成后&#xff0c;等待一會會進入centos的系統初始化界面 二、centos初始化配置 三、配置網絡 1、虛擬網絡編輯器&#xff0c;開啟VMnet1、VMnet8的DHCP vmware左上角工具欄&#xff0c;點擊【編輯】->【虛擬網…

Unity-Mirror網絡框架-從入門到精通之Chat示例

文章目錄 前言Chat聊天室Authentication授權ChatAuthenticatorChat示例中的授權流程聊天Chat最后 前言 在現代游戲開發中&#xff0c;網絡功能日益成為提升游戲體驗的關鍵組成部分。Mirror是一個用于Unity的開源網絡框架&#xff0c;專為多人游戲開發設計。它使得開發者能夠輕…

知識問答系統

文章目錄 早期的問答系統基于信息檢索的問答系統基于知識庫的問答系統CommunityQA/FAQ-QA:基于問答對匹配的問答系統Hybrid QA Framework混合問答系統框架早期的問答系統 20世紀六七十年代,早期的NLIDB(Natural Language Interface toData bBase)伴隨著人工智能的研發逐步興起…

第3章:Go語言復合數據類型

第3章&#xff1a;Go語言復合數據類型 1. 數組 1.1 數組聲明和初始化 // 方式1&#xff1a;聲明固定長度數組 var numbers [5]int // 聲明一個包含5個整數的數組&#xff0c;默認零值// 方式2&#xff1a;初始化數組 arr1 : [5]int{1, 2, 3, 4, 5} // 完全初始化// 方式3&…

uniapp-vue3 實現, 一款帶有絲滑動畫效果的單選框組件,支持微信小程序、H5等多端

采用 uniapp-vue3 實現, 是一款帶有絲滑動畫效果的單選框組件&#xff0c;提供點狀、條狀的動畫過渡效果&#xff0c;支持多項自定義配置&#xff0c;適配 web、H5、微信小程序&#xff08;其他平臺小程序未測試過&#xff0c;可自行嘗試&#xff09; 可到插件市場下載嘗試&…

深度學習GPU服務器推薦:打造高效運算平臺

文章來源于百家號&#xff1a;GPU服務器廠家 在深度學習和人工智能領域&#xff0c;一個高性能的GPU服務器是研究和開發工作的關鍵。今天&#xff0c;我們將為大家推薦一款基于詳細硬件配置表的深度學習GPU服務器&#xff0c;它專為高效運算和數據處理而設計。 一、機箱設計 …

2025第1周 | JavaScript中的正則表達式

目錄 1. 正則表達式是個什么東東&#xff1f;1.1 怎么定義正則1.2 對象字面量方式1.3 類創建方式 2. 怎么使用2.1 實例方法2.1.1 exec方法2.1.2 test方法 2.2 字符串中的方法2.2.1 match/matchAll2.2.2 replace/replaceAll2.2.3 split2.2.4 search 3. 規則3.1 修飾符3.2 字符類…

大模型LLM-Prompt-OPTIMAL

1 OPTIMAL OPTIMAL 具體每項內容解釋如下&#xff1a; Objective Clarity&#xff08;目標清晰&#xff09;&#xff1a;明確定義任務的最終目標和預期成果。 Purpose Definition&#xff08;目的定義&#xff09;&#xff1a;闡述任務的目的和它的重要性。 Information Gat…

78、使用愛芯派2_AX630C開發板 3.2T高有效算力 低功耗 支持AI-ISP真黑光實驗

基本思想:使用愛心元智最新的版本開發板進行實驗 AX630C、AX620Q 都是 620E 這一代 一、參考這個官方教程,先把代碼在本地交叉編譯完成 https://github.com/AXERA-TECH/ax620e_bsp_sdk 然后在拷貝到620c設備上 root@ax630c:~/ax620e_bsp_sdk/msp/out/arm64_glibc/bin# ./…

C語言 掃雷程序設計

目錄 1.main函數 2.菜單打印menu函數 3.游戲game函數 4.宏定義 5.界面初始化 6.打印界面 7.設置雷 8.統計排查坐標周圍雷的個數 9.排查雷 10.總代碼 test.c代碼 game.h代碼 game.c代碼 結語&#xff1a; 一個簡單的掃雷游戲&#xff0c;通過宏定義可以修改行列的…

《高速公路警察模擬器》

一個引人入勝的警察故事在等著你&#xff0c;你可以選擇扮演男警官或女警官。公路警察模擬器》擁有休閑和模擬兩種游戲模式&#xff0c;將兩個世界的精華結合在一起&#xff1a;在身臨其境的虛擬環境中自由駕駛和行走&#xff0c;在故事驅動的游戲中解決各種令人興奮的案件。探…

EasyGBS小知識:如何確保攝像機的網絡連接穩定?

在當今數字化時代&#xff0c;視頻監控系統已成為保障安全和提高效率的重要工具。然而&#xff0c;攝像機的網絡連接穩定性直接關系到監控系統的可靠性和有效性。為了確保視頻監控系統能夠持續穩定地運行&#xff0c;我們需要從硬件、網絡設置、軟件與監控以及安裝與維護等多個…

微服務-Eureka

Eureka的作用 使用RestTemplate完成遠程調用需要被調用者的ip和端口&#xff0c;從而能夠發起http請求&#xff0c;但是如果有很多個實例也更加不能有效的處理&#xff0c;而且我們又該如何知道這些實例是否健康呢。所以就有了很多的注冊中心比如Eureka、Nacos等等。 服務注…

LabVIEW軟件侵權分析與應對

問&#xff1a;如果涉及到LabVIEW軟件的仿制或模仿&#xff0c;特別是在功能、界面等方面&#xff0c;如何判斷是否構成侵權&#xff1f;該如何應對&#xff1f; 答&#xff1a;LabVIEW軟件的侵權問題&#xff0c;尤其是在涉及到仿制或模仿其功能、界面、設計等方面&#xff0…

MATLAB仿真:基于GS算法的經大氣湍流畸變渦旋光束波前校正仿真

GS算法流程 GS&#xff08;Gerchberg-Saxton&#xff09;相位恢復算法是一種基于傅里葉變換的最速下降算法&#xff0c;可以通過輸出平面和輸入平面上光束的光強分布計算出光束的相位分布。圖1是基于GS算法的渦旋光束畸變波前校正系統框圖&#xff0c;在該框圖中&#xff0c;已…