婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang中的sync包的WaitGroup操作

Golang中的sync包的WaitGroup操作

熱門標簽:壽光微信地圖標注 評價高的400電話辦理 外呼系統顯本地手機號 excel地圖標注分布數據 電話機器人軟件免費 阿克蘇地圖標注 涿州代理外呼系統 百度地圖標注后傳給手機 外呼系統用什么卡

sync的waitgroup功能

WaitGroup

使用多線程時,進行等待多線程執行完畢后,才可以結束函數,有兩個選擇

channel

waitgroup

首先使用channel

func add (n *int , isok chan bool){
	for i :=0 ;i 1000 ; i ++ {
		*n = *n + 1
	}
	isok - true
}
func main () {
	var ok = make(chan bool , 2)
	var i,u = 0,0
	go add(i , ok)
	go add(i , ok)
	for - ok {
		u++
		if u == 2 {
			break
		}
	}
	fmt.Println(i)
}

但是,如果線程一旦增多,就會導致代碼冗余,增加負擔,可以使用sync.WaitGroup包

func add (n *int , wait *sync.WaitGroup) {
 for i := 0 ; i 1000 ; i ++ {
  *n = *n + 1
 }
 defer wait.Done()
}
func main () {
  var wait sync.WaitGroup
 var i = 0
 wait.Add(2)
  go add(i , wait)
 go add(i , wait)
 wait.Wait()
 fmt.Println(i)
 }

仿sync.WaitGroup功能

type Wait struct {//創建一個結構體
 Num int//線程的個數
 ok chan bool//線程與函數通信的管道
}
func (t *Wait) Add (n int){//初始化線程個數
 t.Num = n
 t.ok = make(chan bool , n)
}
func (t *Wait) Done (){//執行完一個線程之后,執行的函數,每執行完一個線程,調用函數,使用通信管道進行傳輸一個true
 t.ok - true
}
func (t *Wait) Wait () {//等待函數,每次管道中放入一個true,說明,執行完一個線程,t.Num--,如果等于0說明所有線程執行結束
 for - t.ok {
  t.Num--
  if t.Num == 0 {
   break
  }
 }
}

補充:Golang的WaitGroup陷阱

sync.WaitGroup是并發環境中,一個相當常用的數據結構,用來等待所有協程的結束,在寫代碼的時候都是按著例子的樣子寫的,也沒用深究過它的使用。前幾日想著能不能在協程中執行Add()函數,答案是不能,這里介紹下。

陷阱在WaitGroup的3個函數的調用順序上。先回顧下3個函數的功能:

Add(delta int):給計數器增加delta,比如啟動1個協程就增加1。

Done():協程退出前執行,把計數器減1。

Wait():阻塞等待計數器為0。

考一考

下面的程序是創建了協程father,然后father協程創建了10個子協程,main函數等待所有協程結束后退出,看看下面代碼有沒有什么問題?

package main 
import (
    "fmt"
    "sync"
)
 
func father(wg *sync.WaitGroup) {
    wg.Add(1)
    defer wg.Done()
 
    fmt.Printf("father\n")
    for i := 0; i  10; i++ {
        go child(wg, i)
    }
}
 
func child(wg *sync.WaitGroup, id int) {
    wg.Add(1)
    defer wg.Done()
 
    fmt.Printf("child [%d]\n", id)
}
 
func main() {
    var wg sync.WaitGroup
    go father(wg)
 
    wg.Wait()
    log.Printf("main: father and all chindren exit")
}

發現問題了嗎?如果沒有看下面的運行結果:main函數在子協程結束前就開始結束了。

father
main: father and all chindren exit
child [9]
child [0]
child [4]
child [7]
child [8]

陷阱分析

產生以上問題的原因在于,創建協程后在協程內才執行Add()函數,而此時Wait()函數可能已經在執行,甚至Wait()函數在所有Add()執行前就執行了,Wait()執行時立馬就滿足了WaitGroup的計數器為0,Wait結束,主程序退出,導致所有子協程還沒完全退出,main函數就結束了。

正確的做法

Add函數一定要在Wait函數執行前執行,這在Add函數的文檔中就提示了: Note that calls with a positive delta that occur when the counter is zero must happen before a Wait.。

如何確保Add函數一定在Wait函數前執行呢?在協程情況下,我們不能預知協程中代碼執行的時間是否早于Wait函數的執行時間,但是,我們可以在分配協程前就執行Add函數,然后再執行Wait函數,以此確保。

下面是修改后的程序,以及輸出結果。

package main 
import (
    "fmt"
    "sync"
)
 
func father(wg *sync.WaitGroup) {
    defer wg.Done()
 
    fmt.Printf("father\n")
    for i := 0; i  10; i++ {
        wg.Add(1)
        go child(wg, i)
    }
}
 
func child(wg *sync.WaitGroup, id int) {
    defer wg.Done()
    fmt.Printf("child [%d]\n", id)
}
 
func main() {
    var wg sync.WaitGroup
    wg.Add(1)
    go father(wg)
 
    wg.Wait()
    fmt.Println("main: father and all chindren exit")
}
father
child [9]
child [7]
child [8]
child [1]
child [4]
child [5]
child [2]
child [6]
child [0]
child [3]
main: father and all chindren exit

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • 解決Golang 中使用WaitGroup的那點坑
  • 在golang中使用Sync.WaitGroup解決等待的問題
  • Golang中的sync.WaitGroup用法實例
  • Golang標準庫syscall詳解(什么是系統調用)
  • Golang的os標準庫中常用函數的整理介紹
  • Golang 標準庫 tips之waitgroup詳解

標簽:欽州 吐魯番 雞西 銅川 梅河口 蘭州 汕頭 重慶

巨人網絡通訊聲明:本文標題《Golang中的sync包的WaitGroup操作》,本文關鍵詞  Golang,中的,sync,包的,WaitGroup,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang中的sync包的WaitGroup操作》相關的同類信息!
  • 本頁收集關于Golang中的sync包的WaitGroup操作的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    床上的激情91.| 欧美日韩一区二区三区视频| 国产主播一区二区| 欧美久久久一区| 成人h动漫精品一区二区| 国产精品传媒视频| 色偷偷久久人人79超碰人人澡| 狠狠久久亚洲欧美| 精品国产精品一区二区夜夜嗨 | 色哟哟日韩精品| 亚洲女性喷水在线观看一区| 久久亚洲精品国产精品紫薇| 精品一区二区在线视频| 精品精品欲导航| 日韩一级片网址| 国产精品小仙女| 国产九色精品成人porny| 国产精品天干天干在观线| 一区二区三区在线高清| 欧美日韩精品一区视频| 久久精品国产77777蜜臀| 青青草国产成人99久久| 精品国产免费一区二区三区香蕉| 一区二区三区**美女毛片| 久久婷婷综合激情| 91在线免费看| 午夜欧美2019年伦理| 亚洲精品在线观看视频| 91小视频免费看| 久久99精品视频| **欧美大码日韩| 久久综合久久久久88| 欧美私人免费视频| 紧缚奴在线一区二区三区| 17c精品麻豆一区二区免费| 日韩一级视频免费观看在线| av一区二区三区黑人| 国产蜜臀av在线一区二区三区| 国产高清不卡二三区| 日韩精品一区二区三区老鸭窝| 成人亚洲一区二区一| 裸体健美xxxx欧美裸体表演| 国产精品国产三级国产普通话三级| 色呦呦网站一区| 国产馆精品极品| 蜜桃av一区二区三区电影| 一区在线观看免费| 久久久久亚洲综合| 欧美一区二区国产| 91啪亚洲精品| 成人做爰69片免费看网站| 极品美女销魂一区二区三区 | 亚洲免费观看高清完整版在线观看 | 中文字幕一区二区三区视频| 欧美一区二区三区免费观看视频| 成人免费av资源| 国产在线精品一区二区三区不卡 | 日韩精品影音先锋| 91小视频免费看| 国产成人福利片| 国产精品一区二区免费不卡| 蜜臀99久久精品久久久久久软件| 亚洲影视在线播放| 一区二区三区四区亚洲| 自拍av一区二区三区| 国产精品毛片a∨一区二区三区| 欧美一区二区在线视频| 欧美色电影在线| 欧美午夜精品久久久久久超碰 | 精品一区二区三区久久久| 午夜精品久久久久| 亚洲中国最大av网站| 亚洲伦理在线免费看| ㊣最新国产の精品bt伙计久久| 国产精品无码永久免费888| 国产欧美精品在线观看| 国产欧美日韩亚州综合| 国产女人水真多18毛片18精品视频 | 青青草97国产精品免费观看无弹窗版| 亚洲第一av色| 青草av.久久免费一区| 欧美成人免费网站| 26uuu精品一区二区在线观看| 69久久夜色精品国产69蝌蚪网| 欧美日韩黄色一区二区| 日韩视频不卡中文| 国产无遮挡一区二区三区毛片日本| 久久综合中文字幕| 久久久久久久久久久黄色| 国产欧美中文在线| 日韩限制级电影在线观看| 欧美一区二区三区日韩| 日韩精品一区二区三区视频播放 | 成人小视频在线| 99re热视频精品| 欧美日韩视频第一区| 欧美日韩国产一二三| 亚洲精品一区二区三区四区高清| 国产日韩精品一区二区三区 | 国产成人精品免费一区二区| 日本特黄久久久高潮| 国内成人精品2018免费看| av电影在线观看一区| 欧美日韩大陆一区二区| 久久久久久久久久看片| 亚洲精品国产高清久久伦理二区| 日韩国产一二三区| 亚洲色大成网站www久久九九| 亚洲电影中文字幕在线观看| 久草精品在线观看| 91在线精品秘密一区二区| 91精品午夜视频| 国产精品激情偷乱一区二区∴| 日本视频免费一区| 日本人妖一区二区| 国产福利不卡视频| 欧美日韩不卡一区| 亚洲少妇中出一区| 久久99最新地址| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 亚洲欧美日韩精品久久久久| 亚洲一区二区在线免费看| 日韩不卡手机在线v区| caoporm超碰国产精品| 日韩一级在线观看| 亚洲卡通欧美制服中文| 91蜜桃视频在线| 精品sm在线观看| 久久精品国产**网站演员| 中文字幕一区二| 欧美一区二区在线播放| 国产精品一区二区无线| 亚洲综合在线电影| 欧美va亚洲va国产综合| 91麻豆swag| 精品一区二区三区日韩| 亚洲国产三级在线| 日本一区二区三区四区| 在线综合视频播放| 91免费观看在线| 国产福利一区在线| 免费人成精品欧美精品| 亚洲另类中文字| 国产精品天天看| 日韩久久免费av| 欧美系列亚洲系列| 99久久国产综合精品女不卡| 精品一区二区国语对白| 婷婷成人激情在线网| 亚洲精品国产视频| 国产精品女同一区二区三区| 日韩精品一区二区三区视频| 欧洲精品一区二区三区在线观看| 国产成人欧美日韩在线电影| 免费在线观看一区二区三区| 亚洲国产日韩综合久久精品| 亚洲日本欧美天堂| 欧美国产丝袜视频| 久久久一区二区三区捆绑**| 制服丝袜亚洲色图| 欧美主播一区二区三区美女| 成人白浆超碰人人人人| 国产白丝网站精品污在线入口| 免费看欧美美女黄的网站| 天堂在线亚洲视频| 日本怡春院一区二区| 丝袜美腿成人在线| 亚洲成人黄色影院| 午夜精品福利一区二区三区av | 一级做a爱片久久| 国产精品美女一区二区在线观看| 久久精品在线免费观看| 久久久久国产一区二区三区四区| 欧美精品久久天天躁| 欧美一二三四区在线| 欧美一区二区日韩| 精品国产乱码久久久久久牛牛 | 欧美大片一区二区| 欧美一区二区视频在线观看2022 | 国产不卡视频一区二区三区| 国产成人在线观看免费网站| 国产精品99久久久久| 成人美女视频在线观看| 99久免费精品视频在线观看| 99在线热播精品免费| 色综合夜色一区| 欧美视频一区二区在线观看| 欧美精品在线视频| 久久综合狠狠综合| 中文字幕一区不卡| 一区二区三区在线观看网站| 日韩福利视频导航| 久久99国产精品麻豆| 成人福利电影精品一区二区在线观看| av影院午夜一区| 欧美一区二区精品久久911| 日本一区二区三区久久久久久久久不 | 久久一留热品黄| 国产精品免费免费| 亚洲国产精品一区二区久久|