Golang 語言控制并發 Goroutine的方法_第1頁
Golang 語言控制并發 Goroutine的方法_第2頁
Golang 語言控制并發 Goroutine的方法_第3頁
Golang 語言控制并發 Goroutine的方法_第4頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論