亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > 解決Golang 中使用WaitGroup的那點(diǎn)坑

解決Golang 中使用WaitGroup的那點(diǎn)坑

熱門標(biāo)簽:涿州代理外呼系統(tǒng) 電話機(jī)器人軟件免費(fèi) 百度地圖標(biāo)注后傳給手機(jī) 評價(jià)高的400電話辦理 壽光微信地圖標(biāo)注 外呼系統(tǒng)顯本地手機(jī)號 阿克蘇地圖標(biāo)注 excel地圖標(biāo)注分布數(shù)據(jù) 外呼系統(tǒng)用什么卡

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

關(guān)于WaitGroup的使用網(wǎng)上有很多例子,在此就不做介紹了,我想說的是我在項(xiàng)目中使用WaitGroup遇到的坑。

在項(xiàng)目中,因?yàn)榉?wù)器有同步需求, 所以直接使用了WaitGroup,但是未考慮使用場景,結(jié)果在項(xiàng)目上線之后,高峰期的時(shí)候客戶端經(jīng)常出現(xiàn)卡頓,經(jīng)過多方查找,才發(fā)現(xiàn)如果使用WaitGroup的時(shí)候,未啟動單獨(dú)的goroutine,那么極有可能造成主線程的阻塞

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

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

總結(jié):

將WaitGroup用于goroutine內(nèi),不會導(dǎo)致主線程的阻塞,同樣可以實(shí)現(xiàn)同步的效果。

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

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

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

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

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

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

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

加個(gè)sleep可以等待完成,但是萬一啊,Goroutine有的跑的快,有的慢,你那sleep就一秒,要是有的Goroutine沒跑完不就白瞎了嗎,所以咱們需要一個(gè)機(jī)制,這個(gè)機(jī)制可以幫助咱們?nèi)ス芾鞧oroutine,讓我們知道Goroutine這東西什么時(shí)候停,什么時(shí)候完成。

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

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

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

wg.wait
等待Goroutine結(jié)束之后退出主進(jìn)程
wg.Add
添加Goroutine,其實(shí)你可以把它想成,可添加的最大Goroutine數(shù)
wg.Done
想象成銷毀參數(shù),當(dāng)Goroutine結(jié)束之后調(diào)用,意思就是,你沒了,我減1

WaitGroup的其他注意事項(xiàng)

將Wg作為參數(shù)進(jìn)行傳遞的時(shí)候,需要使用指針

有些時(shí)候,咱們不想寫的這么麻煩,就尋思怎么才能簡單一點(diǎn),或者可變性稍微強(qiáng)一點(diǎn),有些時(shí)候我們要把wg最為參數(shù),在函數(shù)內(nèi)部調(diào)用,我們該怎么寫呢?

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) // 因?yàn)橛袃蓚€(gè)動作,所以增加2個(gè)計(jì)數(shù)
 listip := []string{"10.0.9.11","10.0.9.22","10.0.9.33"}
 for _, ip := range(listip) {
  //假設(shè)我們執(zhí)行一個(gè)ping ip 的邏輯
  go PingIPWork(ip, wg)
  }
 wg.Wait() // 等待,直到計(jì)數(shù)為0
}

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

Wg.Add的數(shù)值不能為負(fù)

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

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《解決Golang 中使用WaitGroup的那點(diǎn)坑》,本文關(guān)鍵詞  解決,Golang,中,使用,WaitGroup,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《解決Golang 中使用WaitGroup的那點(diǎn)坑》相關(guān)的同類信息!
  • 本頁收集關(guān)于解決Golang 中使用WaitGroup的那點(diǎn)坑的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    成人免费一级纶理片| 国产高清在线精品一区二区| 免费国产在线观看| 国产一区二区精品久| 日韩中文字幕一区| 精品视频在线观看免费| 日本免费看视频| 欧美a级v片不卡在线观看| 免费国产在线观看不卡| 日本伦理片网站| 亚洲 欧美 成人日韩| 欧美另类videosbestsex久久| 国产高清在线精品一区二区| 久久国产精品只做精品| 青草国产在线观看| 韩国毛片基地| 青青久久精品| 国产美女在线观看| 国产成人欧美一区二区三区的| 91麻豆精品国产自产在线 | 精品国产一区二区三区久久久狼| 亚洲精品久久久中文字| 久久国产一久久高清| 韩国三级香港三级日本三级la | 国产一区二区精品久久| 国产91素人搭讪系列天堂| a级精品九九九大片免费看| 精品国产一区二区三区久久久蜜臀 | 精品国产一级毛片| 国产成人啪精品视频免费软件| 精品国产三级a| 中文字幕一区二区三区 精品| 欧美一区二区三区性| 日韩女人做爰大片| 久久国产精品只做精品| 亚洲精品久久玖玖玖玖| 欧美另类videosbestsex久久 | 国产精品1024永久免费视频| 精品久久久久久影院免费| 91麻豆精品国产自产在线| 日本免费看视频| 99久久精品国产麻豆| 精品国产一区二区三区精东影业| 韩国三级一区| 毛片的网站| 国产美女在线观看| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 尤物视频网站在线观看| 国产视频一区二区在线观看| 久久国产一久久高清| 999久久狠狠免费精品| 国产a毛片| 韩国毛片免费大片| 天天做人人爱夜夜爽2020| 国产伦久视频免费观看 视频| 欧美一区二区三区在线观看| 国产国产人免费视频成69堂| 青草国产在线观看| 精品久久久久久免费影院| 日本在线不卡视频| 精品视频在线观看免费| 亚洲女人国产香蕉久久精品| 日韩一级黄色大片| 日韩在线观看视频网站| 精品在线观看国产| 日日夜夜婷婷| 999久久66久6只有精品| 高清一级片| 国产一区二区精品久久| 亚洲不卡一区二区三区在线| 一级毛片视频免费| 国产一区二区高清视频| 久久精品成人一区二区三区| 久草免费资源| 欧美国产日韩一区二区三区| 四虎影视精品永久免费网站| 亚洲精品久久久中文字| 日韩专区一区| 精品国产一区二区三区免费| 久久国产精品永久免费网站| 国产91素人搭讪系列天堂| 免费一级片网站| 欧美大片一区| 一级女性全黄久久生活片| 韩国毛片免费| 久久久久久久久综合影视网| 国产不卡在线观看| 美女被草网站| 久久久久久久免费视频| 麻豆系列 在线视频| 国产视频在线免费观看| 一级毛片视频播放| 毛片高清| 欧美激情一区二区三区视频| 99色视频| 韩国毛片免费大片| 毛片高清| 久久久久久久免费视频| 亚欧成人乱码一区二区 | 日韩在线观看视频免费| 午夜在线观看视频免费 成人| 精品国产香蕉伊思人在线又爽又黄| 黄色短视屏| 精品久久久久久综合网| 色综合久久天天综合| 四虎影视库| 国产网站在线| 欧美日本二区| 二级片在线观看| 精品国产一区二区三区国产馆| 中文字幕一区二区三区 精品| 999久久狠狠免费精品| a级毛片免费观看网站| 亚洲www美色| 一级片免费在线观看视频| 久久久成人影院| 精品国产亚洲人成在线| 免费一级片网站| 国产一区二区精品久久| 国产成人精品综合久久久| 国产91丝袜高跟系列| 黄视频网站在线看| 成人免费一级纶理片| 精品国产亚洲人成在线| 精品国产一区二区三区精东影业| 可以免费在线看黄的网站| 日韩中文字幕一区| 日韩av成人| 日本特黄特黄aaaaa大片| 国产一区二区精品| 久久精品成人一区二区三区| 日本伦理片网站| 成人a级高清视频在线观看| 美女被草网站| 亚洲精品久久久中文字| 青青青草视频在线观看| 精品久久久久久中文字幕一区| 国产国产人免费视频成69堂| 日韩综合| 美女免费精品高清毛片在线视| 国产91精品系列在线观看| 欧美一级视| 欧美一级视频免费观看| 日韩女人做爰大片| 黄视频网站在线看| 天天做日日干| 亚州视频一区二区| 精品国产香蕉在线播出| 99久久视频| 91麻豆精品国产高清在线| 国产一区二区精品| 香蕉视频久久| 欧美国产日韩精品| 久久精品欧美一区二区| 香蕉视频一级| 久久精品免视看国产成人2021| 国产一区二区高清视频| 精品国产亚洲人成在线| 亚洲天堂在线播放| 黄色免费三级| 免费的黄视频| 日韩av成人| 成人a大片在线观看| 色综合久久久久综合体桃花网| 国产91素人搭讪系列天堂| 国产91精品系列在线观看| 欧美激情伊人| 欧美一级视| 可以免费看毛片的网站| 欧美日本免费| 国产高清在线精品一区a| 一级女性全黄久久生活片| 99久久网站| 精品国产香蕉在线播出| 超级乱淫伦动漫| 成人在免费观看视频国产| 天天做人人爱夜夜爽2020| 欧美电影免费看大全| 国产福利免费观看| 成人免费观看视频| 可以免费看污视频的网站| 成人高清视频在线观看| 国产伦理精品| 亚欧成人乱码一区二区 | a级毛片免费全部播放| 欧美国产日韩在线| 免费一级生活片| 久久久成人影院| 成人影院一区二区三区| 韩国三级视频网站| 国产成人精品综合| 青青久久精品| 美女被草网站| 国产伦理精品| 青青久久国产成人免费网站| 久久国产精品只做精品| 青青久久国产成人免费网站| 国产麻豆精品高清在线播放| 精品国产三级a∨在线观看| 99色视频在线观看|