校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 解決Golang 中使用WaitGroup的那點坑

解決Golang 中使用WaitGroup的那點坑

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

sync.WaitGroup對于Golang開發者來說并不陌生,其經常作為多協程之間同步的一種機制。用好它勢必會讓你事半功倍,但是一旦錯用將引發問題。

關于WaitGroup的使用網上有很多例子,在此就不做介紹了,我想說的是我在項目中使用WaitGroup遇到的坑。

在項目中,因為服務器有同步需求, 所以直接使用了WaitGroup,但是未考慮使用場景,結果在項目上線之后,高峰期的時候客戶端經常出現卡頓,經過多方查找,才發現如果使用WaitGroup的時候,未啟動單獨的goroutine,那么極有可能造成主線程的阻塞

所以我做了下面的測試(測試中,我把WaitGroup置于協程內):

import (
 "fmt"
 "sync"
 "time"
)
 
func main() {
    fmt.Println("main-1")
 testW()
 fmt.Println("main-2")
 time.Sleep(time.Duration(15) * time.Second) 
}
 
func testW() {
 fmt.Println("testW-1")
 go func() {
  var wg sync.WaitGroup
  fmt.Println("testW-2")
  testW1(wg)
  fmt.Println("testW-5")
  wg.Wait()
  fmt.Println("testW-6")
 }()
}
 
func testW1(wg *sync.WaitGroup) {
 wg.Add(1)
 fmt.Println("testW-3")
 time.AfterFunc(time.Second*5, func() {
  wg.Done()
 })
 fmt.Println("testW-4")
 
}

輸出為:

main-1

testchan-1

main-2

testchan-2

testchan-3

testchan-4

testchan-5

// 過5秒

testchan-6

總結:

將WaitGroup用于goroutine內,不會導致主線程的阻塞,同樣可以實現同步的效果。

補充:WaitGroup的簡單用法(等待組)

你品一下人家這名字,等待組。等待什么,等待goroutine完成啊。有些時候,我們啟動多個goroutine去執行任務,我舉個例子

listip := []string{"10.0.9.11","10.0.9.22","10.0.9.33"}
for _, ip := range(listip) {
    //假設我們執行一個ping ip 的邏輯
    go PingIPWork(ip)
}

我這里執行了一個多ip去ping的邏輯,一般這種時候,你要是執行一波,人家肯定毛都不會返回給你,為什么?因為人家主線程直接就退出了,還是那句話,你又沒告訴人家主線程要等這ip全部都ping 完,所以你必須要加個等待,等著Goroutine完成,這里我再舉一個網上的例子

package main
import (
    "fmt"
)
func main() {
    go func() {
        fmt.Println("Goroutine 1")
    }()
    go func() {
        fmt.Println("Goroutine 2")
    }()
    //來個睡眠,等Goroutine結束
    time.Sleep(time.Second * 1)
}

看到了么,加了一個sleep,用sleep去等著Goroutine跑完,上面我舉的那個例子也可以這么來

listip := []string{"10.0.9.11","10.0.9.22","10.0.9.33"}
for _, ip := range(listip) {
    //假設我們執行一個ping ip 的邏輯
    go PingIPWork(ip)
}
time.Sleep(time.Second * 1)

加個sleep可以等待完成,但是萬一啊,Goroutine有的跑的快,有的慢,你那sleep就一秒,要是有的Goroutine沒跑完不就白瞎了嗎,所以咱們需要一個機制,這個機制可以幫助咱們去管理Goroutine,讓我們知道Goroutine這東西什么時候停,什么時候完成。

所以,WaitGroup這個東西,就可以幫助我們解決這個問題,還是老樣子,我舉一個簡單的例子來說明我的想法。

package main
import (
    "fmt"
 "sync"
)
func PingIPWork(ip string) {
 fmt.Println(ip)
}
func main() {
    //定義一個等待阿祖
 var wg sync.WaitGroup
 wg.Add(3) // 因為有3個Ip,咱們定義三個動作,所以來三個計數
 listip := []string{"10.0.9.11","10.0.9.22","10.0.9.33"}
 for _, ip := range(listip) {
  //假設我們執行一個ping ip 的邏輯
  go func(ip string) {
            //執行一個work
            PingIPWork(ip)
            //操作完成之后,done一個計數,也就是3-1
   wg.Done()
  }(ip)
 }
    //等待
 wg.Wait() // 等待,直到計數為0
}

這里我舉了一個簡單的例子,其實wg的用法較為簡單,在這個例子里面我們用到了

wg.wait
等待Goroutine結束之后退出主進程
wg.Add
添加Goroutine,其實你可以把它想成,可添加的最大Goroutine數
wg.Done
想象成銷毀參數,當Goroutine結束之后調用,意思就是,你沒了,我減1

WaitGroup的其他注意事項

將Wg作為參數進行傳遞的時候,需要使用指針

有些時候,咱們不想寫的這么麻煩,就尋思怎么才能簡單一點,或者可變性稍微強一點,有些時候我們要把wg最為參數,在函數內部調用,我們該怎么寫呢?

package main
import (
 "fmt"
 "sync"
)
func PingIPWork(ip string, wg *sync.WaitGroup) {
 fmt.Println(ip)
 wg.Done()
}
func main() {
 var wg sync.WaitGroup
 wg.Add(3) // 因為有兩個動作,所以增加2個計數
 listip := []string{"10.0.9.11","10.0.9.22","10.0.9.33"}
 for _, ip := range(listip) {
  //假設我們執行一個ping ip 的邏輯
  go PingIPWork(ip, wg)
  }
 wg.Wait() // 等待,直到計數為0
}

看到了么,如果你把Wg作為參數進行傳遞,你得要用指針的形式傳值,否則就會死鎖!!!!!!!!

Wg.Add的數值不能為負

wg.Add()的數值必須為正數,如果為負數,將會拋出異常。

panic: sync: negative WaitGroup counter
goroutine 1 [running]:
sync.(*WaitGroup).Add(0xc042008230, 0xffffffffffffff9c)
    D:/Go/src/sync/waitgroup.go:75 +0x1d0
main.main()
    D:/code/go/src/test-src/2-Package/sync/waitgroup/main.go:10 +0x54

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

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

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

巨人網絡通訊聲明:本文標題《解決Golang 中使用WaitGroup的那點坑》,本文關鍵詞  解決,Golang,中,使用,WaitGroup,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《解決Golang 中使用WaitGroup的那點坑》相關的同類信息!
  • 本頁收集關于解決Golang 中使用WaitGroup的那點坑的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    国产欧美精品一区二区色综合朱莉| 欧美一区二区在线不卡| 老汉av免费一区二区三区| 国内久久精品视频| 99re在线视频这里只有精品| 精品国产1区二区| 五月综合激情网| 91丨porny丨首页| 国产女主播一区| 精品一区二区综合| 91麻豆精品国产91久久久使用方法 | 欧美va亚洲va香蕉在线| 亚洲精品v日韩精品| 成人黄色免费短视频| 久久综合九色综合欧美98| 蜜桃久久久久久久| 欧美军同video69gay| 一区二区高清在线| 色噜噜狠狠成人中文综合 | 亚洲视频在线观看一区| 国产夫妻精品视频| 日韩欧美卡一卡二| 人妖欧美一区二区| 欧美一级黄色录像| 蜜臀av一区二区在线观看 | 欧美韩国日本不卡| 国产精品一区不卡| 国产亚洲自拍一区| 国产成人一级电影| 国产欧美视频一区二区| 国产成人在线视频网站| 中国色在线观看另类| 成人黄色在线看| 亚洲人成影院在线观看| 色琪琪一区二区三区亚洲区| 亚洲美女区一区| 欧美日韩一区二区在线观看视频| 亚洲一区自拍偷拍| 欧美高清一级片在线| 婷婷成人激情在线网| 欧美一级日韩一级| 国产伦精品一区二区三区在线观看| 精品美女一区二区三区| 国产高清不卡一区| 亚洲欧洲另类国产综合| 欧美性受xxxx黑人xyx性爽| 日韩二区在线观看| 精品久久久久久无| 99视频在线观看一区三区| 亚洲精品午夜久久久| 99在线热播精品免费| 韩国一区二区三区| 国产精品亚洲一区二区三区在线 | 欧美三级一区二区| 91视频xxxx| 欧美手机在线视频| 欧美精品一区二区三区视频| 一区二区三区四区不卡在线| 精品福利一区二区三区| 亚洲国产aⅴ成人精品无吗| 欧美日韩三级在线| 国产精品一区三区| 亚洲最色的网站| 日韩手机在线导航| 国产成人小视频| 亚洲第四色夜色| 久久九九99视频| 欧美日韩黄色影视| 国产成人鲁色资源国产91色综| 亚洲欧美激情一区二区| 日韩欧美国产电影| 91麻豆123| 国产精品亚洲综合一区在线观看| 亚洲综合色噜噜狠狠| 久久先锋影音av| 91精品欧美久久久久久动漫| 成人久久久精品乱码一区二区三区| 午夜精品久久久久影视| 久久久久久久久久美女| 欧美日韩国产高清一区| 成人福利视频在线看| 日韩av电影天堂| 亚洲愉拍自拍另类高清精品| 久久蜜桃香蕉精品一区二区三区| 欧美中文字幕一二三区视频| 国产精品综合在线视频| 午夜精品视频在线观看| 亚洲国产精品激情在线观看| 欧美一区二区三区日韩视频| 日本精品视频一区二区| 不卡电影免费在线播放一区| 国产一区二区三区在线观看免费视频| 亚洲.国产.中文慕字在线| 亚洲欧美另类图片小说| 亚洲欧洲一区二区在线播放| 久久久高清一区二区三区| 日韩一级免费观看| 91精品国产品国语在线不卡| 在线精品国精品国产尤物884a| www.日韩在线| 成人午夜av电影| 国产精品亚洲一区二区三区妖精| 久久电影网电视剧免费观看| 日韩和欧美的一区| 日韩激情在线观看| 青青草成人在线观看| 日韩和欧美的一区| 日本欧美在线观看| 美女免费视频一区二区| 麻豆精品在线观看| 久久国产夜色精品鲁鲁99| 男女男精品网站| 日本伊人色综合网| 麻豆传媒一区二区三区| 麻豆国产精品官网| 激情伊人五月天久久综合| 久久99精品国产麻豆婷婷| 激情六月婷婷综合| 成人亚洲一区二区一| 99re这里只有精品视频首页| 99久久99久久综合| 91热门视频在线观看| 在线观看国产精品网站| 正在播放一区二区| 久久中文字幕电影| 国产日韩欧美亚洲| 亚洲欧美激情在线| 日韩黄色小视频| 黄色成人免费在线| 97久久超碰国产精品| 欧美午夜免费电影| 91精品国产aⅴ一区二区| 日韩视频免费直播| 久久久久99精品国产片| 亚洲视频免费在线| 视频一区二区欧美| 国产美女av一区二区三区| 成人免费看视频| 欧美三级韩国三级日本三斤| 精品国产乱码久久久久久图片| 国产免费成人在线视频| 亚洲男人电影天堂| 日韩国产欧美三级| 国产精品66部| 欧美色图片你懂的| 欧美成人官网二区| 亚洲视频狠狠干| 久久国产麻豆精品| 91网页版在线| 久久亚洲综合色一区二区三区| 亚洲天堂网中文字| 蜜臀av一区二区在线免费观看 | 成人天堂资源www在线| 欧美三级韩国三级日本一级| ww亚洲ww在线观看国产| 一区二区三区国产豹纹内裤在线| 久久国产精品免费| 色婷婷香蕉在线一区二区| 欧美成人精品1314www| 自拍视频在线观看一区二区| 精品在线一区二区| 欧美中文字幕一区二区三区亚洲| 久久久久久免费网| 日韩经典一区二区| 在线亚洲+欧美+日本专区| 国产视频一区在线观看| 日韩成人精品视频| 欧美中文一区二区三区| 中文字幕不卡的av| 久久精品国产亚洲a| 欧美日韩极品在线观看一区| 国产精品国产三级国产普通话蜜臀 | 国产成人啪免费观看软件 | 极品少妇xxxx精品少妇偷拍| 欧美日韩三级视频| 亚洲男人都懂的| 9l国产精品久久久久麻豆| 欧美sm极限捆绑bd| 免费精品视频最新在线| 欧美日韩一区二区三区四区| 国产精品伦一区| 国产伦理精品不卡| 久久久久久日产精品| 九色综合国产一区二区三区| 欧美日本一道本在线视频| 一区二区在线免费| 色噜噜久久综合| 亚洲精品视频在线观看免费| 99久久久国产精品| 国产精品国模大尺度视频| 国产精品911| 国产视频在线观看一区二区三区| 久久97超碰国产精品超碰| 日韩一区二区三区在线| 美女爽到高潮91| 久久蜜桃一区二区| 粉嫩av一区二区三区在线播放| 国产女主播视频一区二区| 国产精品一区二区久久精品爱涩| 久久久久久久久久美女|