



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第Golang語言控制并發Goroutine的方法goroutine是Go語言中的輕量級線程實現,由Go運行時(runtime)管理。Go程序會智能地將goroutine中的任務合理地分配給每個CPU。
Golang語言的優勢之一是天生支持并發,我們在Golang語言開發中,通常使用的并發控制方式主要有Channel,WaitGroup和Context,本文我們主要介紹一下Golang語言中并發控制的這三種方式怎么使用關于它們各自的詳細介紹在之前的文章已經介紹過,感興趣的讀者朋友們可以按需翻閱。
02Channel
在Golang語言中,Channel不僅可以用于協程之間通信,還可以使用Channel控制子協程,而且使用Channel實現并發控制比較簡單,比如以下示例,我們在Golang應用程序中啟動兩個協程,分別是主協程和子協程,主協程需要等待子協程運行結束后再退出程序。
示例代碼:
funcmain(){
done:=make(chanstruct{})
gofunc(){
fmt.Println("goroutinerunover")
done-struct{}{}
}()
-done
fmt.Println("maingoroutinerunover")
}
閱讀上面這段代碼,我們在子goroutine運行結束后,通過Channel通知主goroutine退出程序,實際上也可以反過來處理,主goroutine通知子goroutine退出程序,主goroutine向channel中發送數據,子goroutine等待接收channel中的數據。
03sync.WaitGroup
如果在Golang應用程序中,需要讓主goroutine等待多個goroutine都運行結束后再退出程序,我們應該怎么實現呢是的,同樣可以使用Channel實現,但是,有一個更優雅的實現方式,那就是WaitGroup,顧名思義,WaitGroup就是等待一組goroutine運行結束。
示例代碼:
funcmain(){
wg:=sync.WaitGroup{}
wg.Add(10)
fori:=0;ii++{
gofunc(idint){
fmt.Println(id,"運行結束")
wg.Done()
}(i)
wg.Wait()
fmt.Println("maingoroutinerunover")
}
閱讀上面這段代碼,我們啟動10個子goroutine,主goroutine需要等待10個子goroutine都運行結束后再退出程序,我們使用的是WaitGroup,它有三個方法,分別是Add、Done和Wait,實際上WaitGroup維護了一個計數器,這三個方法都是圍繞這個計數器工作,Add用于設置計數器的數值,Done用于扣減計數器的數值,Wait在計數器數值為0之前一直阻塞。關于WaitGroup的源碼解讀,在之前的文章中已介紹過,限于篇幅,這里就不再贅述。
04Context
Channel和WaitGroup通常用于父子兩個層級的goroutine的應用程序的并發控制中,如果在Golang應用程序中,子協程繼續派生出協程,我們應該怎么控制呢這種多級goroutine的應用程序,我們可以使用Context實現并發控制。
示例代碼:
funcmain(){
ctx,cancel:=context.WithCancel(context.Background())
gofirstCtx(ctx)
time.Sleep(5*time.Second)
fmt.Println("stopallsubgoroutine")
cancel()
time.Sleep(5*time.Second)
funcfirstCtx(ctxcontext.Context){
gosecondCtx(ctx)
for{
select{
case-ctx.Done():
fmt.Println("firstdone")
return
default:
fmt.Println("firstrunning")
time.Sleep(2*time.Second)
funcsecondCtx(ctxcontext.Context){
for{
select{
case-ctx.Done():
fmt.Println("seconddone")
return
default:
fmt.Println("secondrunning")
time.Sleep(2*time.Second)
}
閱讀上面這段代碼,在子協程firstCtx啟動子協程secondCtx,主goroutine創建context,并把context傳遞到所有子協程,然后主goroutine通過調用cancle停掉所有子協程。
本
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 八年級物理(上冊)練習試題
- 小學生辯論賽課件
- 小學生課件兒歌視頻教學
- 10 必修1 第二單元 第9講 細胞呼吸的原理和應用
- 跨國項目數據合規審查與隱私保護服務協議
- 跨境電商采購合同糾紛解決與合規管理
- 文化場館安保服務勞務派遣合同
- 醫學常見病癥診斷與處理知識試卷含法洛四聯征等案例
- 2024-2025學年湖北省云學聯盟高一下學期5月月考歷史試題及答案
- 團隊管理實踐案例分析框架構建考核試卷
- 電工廠搬遷方案(3篇)
- 2025年南京市中考數學真題試卷
- 老年人眼科疾病
- 鋼板配送設計方案(3篇)
- 2025年內蒙古煤炭地質勘查(集團)一零九有限公司招聘筆試參考題庫含答案解析
- 中醫基礎學課件護理情志
- 小學三年級科學下冊教案
- T/CBMCA 039-2023陶瓷大板巖板裝修鑲貼應用規范
- 2025-2030中國美容美發行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025年中國不銹鋼蝕刻板數據監測研究報告
- 免疫檢查點抑制劑相關肺炎診治和管理專家共識(2025)要點解讀
評論
0/150
提交評論