好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁(yè) > 知識(shí)庫(kù) > Golang 語(yǔ)言控制并發(fā) Goroutine的方法

Golang 語(yǔ)言控制并發(fā) Goroutine的方法

熱門(mén)標(biāo)簽:上海企業(yè)外呼系統(tǒng)排名 電腦外呼系統(tǒng)輻射大嗎 揚(yáng)州電銷(xiāo)外呼系統(tǒng)軟件 百度地圖標(biāo)注位置網(wǎng)站 400手機(jī)電話(huà)免費(fèi)辦理 如何利用高德地圖標(biāo)注家 武漢百應(yīng)人工智能電銷(xiāo)機(jī)器人 開(kāi)通400電話(huà)申請(qǐng)流程 智能語(yǔ)音電銷(xiāo)的機(jī)器人

goroutine 是 Go語(yǔ)言中的輕量級(jí)線(xiàn)程實(shí)現(xiàn),由 Go 運(yùn)行時(shí)(runtime)管理。Go 程序會(huì)智能地將 goroutine 中的任務(wù)合理地分配給每個(gè) CPU。

01介紹

Golang 語(yǔ)言的優(yōu)勢(shì)之一是天生支持并發(fā),我們?cè)?Golang 語(yǔ)言開(kāi)發(fā)中,通常使用的并發(fā)控制方式主要有 Channel,WaitGroup 和 Context,本文我們主要介紹一下 Golang 語(yǔ)言中并發(fā)控制的這三種方式怎么使用?關(guān)于它們各自的詳細(xì)介紹在之前的文章已經(jīng)介紹過(guò),感興趣的讀者朋友們可以按需翻閱。

02Channel

在 Golang 語(yǔ)言中,Channel 不僅可以用于協(xié)程之間通信,還可以使用 Channel 控制子協(xié)程,而且使用 Channel 實(shí)現(xiàn)并發(fā)控制比較簡(jiǎn)單,比如以下示例,我們?cè)?Golang 應(yīng)用程序中啟動(dòng)兩個(gè)協(xié)程,分別是主協(xié)程和子協(xié)程,主協(xié)程需要等待子協(xié)程運(yùn)行結(jié)束后再退出程序。

示例代碼:

func main () { 
 done := make(chan struct{}) 
 go func() { 
  fmt.Println("goroutine run over") 
  done - struct{}{} 
 }() 
 - done 
 fmt.Println("main goroutine run over") 
} 

閱讀上面這段代碼,我們?cè)谧?goroutine 運(yùn)行結(jié)束后,通過(guò) Channel 通知主 goroutine 退出程序,實(shí)際上也可以反過(guò)來(lái)處理,主 goroutine 通知子 goroutine 退出程序,主 goroutine 向 channel 中發(fā)送數(shù)據(jù),子 goroutine 等待接收 channel 中的數(shù)據(jù)。

03sync.WaitGroup

如果在 Golang 應(yīng)用程序中,需要讓主 goroutine 等待多個(gè) goroutine 都運(yùn)行結(jié)束后再退出程序,我們應(yīng)該怎么實(shí)現(xiàn)呢?是的,同樣可以使用 Channel 實(shí)現(xiàn),但是,有一個(gè)更優(yōu)雅的實(shí)現(xiàn)方式,那就是 WaitGroup,顧名思義,WaitGroup 就是等待一組 goroutine 運(yùn)行結(jié)束。

示例代碼:

func main () { 
 wg := sync.WaitGroup{} 
 wg.Add(10) 
 for i := 0; i  10; i++ { 
  go func(id int) { 
   fmt.Println(id, "運(yùn)行結(jié)束") 
   wg.Done() 
  }(i) 
 } 
 wg.Wait() 
 fmt.Println("main goroutine run over") 
} 

閱讀上面這段代碼,我們啟動(dòng) 10 個(gè)子 goroutine,主 goroutine 需要等待 10 個(gè)子 goroutine 都運(yùn)行結(jié)束后再退出程序,我們使用的是 WaitGroup,它有三個(gè)方法,分別是 Add、Done 和 Wait,實(shí)際上 WaitGroup 維護(hù)了一個(gè)計(jì)數(shù)器,這三個(gè)方法都是圍繞這個(gè)計(jì)數(shù)器工作,Add 用于設(shè)置計(jì)數(shù)器的數(shù)值,Done 用于扣減計(jì)數(shù)器的數(shù)值,Wait 在計(jì)數(shù)器數(shù)值為 0 之前一直阻塞。關(guān)于 WaitGroup 的源碼解讀,在之前的文章中已介紹過(guò),限于篇幅,這里就不再贅述。

04Context

Channel 和 WaitGroup 通常用于父子兩個(gè)層級(jí)的 goroutine 的應(yīng)用程序的并發(fā)控制中,如果在 Golang 應(yīng)用程序中,子協(xié)程繼續(xù)派生出協(xié)程,我們應(yīng)該怎么控制呢?這種多級(jí) goroutine 的應(yīng)用程序,我們可以使用 Context 實(shí)現(xiàn)并發(fā)控制。

示例代碼:

func main() { 
 ctx, cancel := context.WithCancel(context.Background()) 
 go firstCtx(ctx) 
 time.Sleep(5 * time.Second) 
 fmt.Println("stop all sub goroutine") 
 cancel() 
 time.Sleep(5 * time.Second) 
} 
 
func firstCtx(ctx context.Context) { 
 go secondCtx(ctx) 
 for { 
  select { 
  case -ctx.Done(): 
   fmt.Println("first done") 
   return 
  default: 
   fmt.Println("first running") 
   time.Sleep(2 * time.Second) 
  } 
 } 
} 
 
func secondCtx(ctx context.Context) { 
 for { 
  select { 
  case -ctx.Done(): 
   fmt.Println("second done") 
   return 
  default: 
   fmt.Println("second running") 
   time.Sleep(2 * time.Second) 
  } 
 } 
} 

閱讀上面這段代碼,在子協(xié)程 firstCtx 啟動(dòng)子協(xié)程 secondCtx,主 goroutine 創(chuàng)建 context,并把 context 傳遞到所有子協(xié)程,然后主 goroutine 通過(guò)調(diào)用 cancle 停掉所有子協(xié)程。

05總結(jié)

本文我們介紹了不同場(chǎng)景中分別適合哪種控制并發(fā) goroutine 的方式,其中,channel 適合控制少量 并發(fā) goroutine,WaitGroup 適合控制一組并發(fā) goroutine,而 context 適合控制多級(jí)并發(fā) goroutine。

到此這篇關(guān)于Golang 語(yǔ)言控制并發(fā) Goroutine的方法的文章就介紹到這了,更多相關(guān)Golang并發(fā)控制Goroutine內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 解決Golang中g(shù)oroutine執(zhí)行速度的問(wèn)題
  • golang goroutine順序輸出方式
  • golang gin 框架 異步同步 goroutine 并發(fā)操作
  • GOLANG使用Context管理關(guān)聯(lián)goroutine的方法
  • Golang 探索對(duì)Goroutine的控制方法(詳解)
  • 關(guān)于Golang中for-loop與goroutine的問(wèn)題詳解

標(biāo)簽:延邊 江西 武漢 嘉峪關(guān) 黑龍江 張掖 新余 宜賓

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang 語(yǔ)言控制并發(fā) Goroutine的方法》,本文關(guān)鍵詞  Golang,語(yǔ)言,控制,并發(fā),Goroutine,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Golang 語(yǔ)言控制并發(fā) Goroutine的方法》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于Golang 語(yǔ)言控制并發(fā) Goroutine的方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 一本色道久久综合亚洲精品久久| chinese妇女淋浴voyeur| 午夜短视频| 99久久精品国产高潮迪丽热巴| 夜里被老头摸出水好爽| 精东黄色软件| 一本大道香蕉视频在线观看| 欧美AV色香蕉一区二区蜜桃小说| 1000部啪啪未满十八勿入机器| 亚洲人成人| 国产老头Gay和老头Gay视频| 高hhhh文| 久久久久久精品国产观看灭火宝贝| 久久精品—区二区三区舞蹈李宗瑞 | 91手机在线视频| 张柏芝54张无删码相片| 精品国产日韩欧美久久| nba98八度免费版| 太粗太硬小寡妇受不了视频| 日日麻批的全部过程| 免费xxxx日本大片在线观看| 男和女全身脱了还亲嘴的图片| 小说区图片区亚洲| 国产日本在线| AI换脸精品秘?入口| 夜夜躁日日躁狠狠躁天气预报 | 黄色录像一级| 欧美69xxxxx| 久久爱鲁鲁鲁鲁夜夜夜夜| 国产精品亚洲片在线va| 粗大猛地挺进娇喘呻吟偷| 日本高h视频| 大胸美女100%裸体无遮挡| 老头老太bbbbbxxxxx| 一级毛片一级毛片一级毛片| 日本理论片午夜理论电影| 黄a一级爽爽影视视频| 亚洲波多野结衣日韩在线| 我趁小子睡觉侵犯了她| 夜倾情保姆的诱惑| 国产激情视频在线播放|