欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁(yè) > 知識(shí)庫(kù) > 解決Golang 中使用WaitGroup的那點(diǎn)坑

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

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

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

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

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

所以我做了下面的測(cè)試(測(cè)試中,我把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

// 過(guò)5秒

testchan-6

總結(jié):

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

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

你品一下人家這名字,等待組。等待什么,等待goroutine完成啊。有些時(shí)候,我們啟動(dòng)多個(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í)行一波,人家肯定毛都不會(huì)返回給你,為什么?因?yàn)槿思抑骶€程直接就退出了,還是那句話,你又沒(méi)告訴人家主線程要等這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")
    }()
    //來(lái)個(gè)睡眠,等Goroutine結(jié)束
    time.Sleep(time.Second * 1)
}

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

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

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

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è)動(dòng)作,所以來(lái)三個(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è)簡(jiǎn)單的例子,其實(shí)wg的用法較為簡(jiǎn)單,在這個(gè)例子里面我們用到了

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

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

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

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

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è)動(dòng)作,所以增加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)行傳遞,你得要用指針的形式傳值,否則就會(huì)死鎖?。。。。。。?!

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

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

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解決等待的問(wèn)題
  • Golang中的sync包的WaitGroup操作
  • Golang中的sync.WaitGroup用法實(shí)例
  • Golang標(biāo)準(zhǔn)庫(kù)syscall詳解(什么是系統(tǒng)調(diào)用)
  • Golang的os標(biāo)準(zhǔn)庫(kù)中常用函數(shù)的整理介紹
  • Golang 標(biāo)準(zhǔn)庫(kù) tips之waitgroup詳解

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《解決Golang 中使用WaitGroup的那點(diǎn)坑》,本文關(guān)鍵詞  解決,Golang,中,使用,WaitGroup,;如發(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 中使用WaitGroup的那點(diǎn)坑》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于解決Golang 中使用WaitGroup的那點(diǎn)坑的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    人人干在线观看| 91精品婷婷国产综合久久性色| 日韩免费视频一区二区| 亚洲国产你懂的| 99久久99久久久精品齐齐| 亚洲人做受高潮| 国产欧美一区二区精品婷婷| 久久国产三级精品| 加勒比精品视频| 欧美一区二区日韩| 日韩影院免费视频| 久久久久国产精品区片区无码| 91精品婷婷国产综合久久性色| 亚洲va欧美va天堂v国产综合| 熟女人妻一区二区三区免费看| 欧美色欧美亚洲另类二区| 国产精品二区一区二区aⅴ污介绍| 国产成人精品午夜视频免费| 看黄色录像一级片| 成人欧美一区二区三区白人| 成人app软件下载大全免费| 国产女人18水真多毛片18精品| 中文字幕第一页久久| 成人v精品蜜桃久久一区| 色综合色狠狠天天综合色| 日韩一区欧美小说| 久久无码人妻一区二区三区| 欧美日韩久久久一区| 亚洲成av人片| 3d动漫精品啪啪一区二区下载| 欧美videos中文字幕| 精品一区二区三区香蕉蜜桃| 黄色av片三级三级三级免费看| 中文字幕第一区综合| 99久久国产免费看| 69堂国产成人免费视频| 美国精品在线观看| 99热6这里只有精品| 亚洲欧洲www| 日本少妇一级片| 欧美一区二区三区系列电影| 久久福利视频一区二区| 极品魔鬼身材女神啪啪精品| 伊人色综合久久天天人手人婷| 国产精品久久久久久亚洲色| 欧美mv日韩mv| 成人综合在线观看| 欧美怡红院视频| 日本aⅴ精品一区二区三区| 女女互磨互喷水高潮les呻吟| 欧美国产丝袜视频| 91美女精品福利| 欧美电影免费观看高清完整版在线| 激情深爱一区二区| 在线一区二区三区四区五区 | 一本色道久久加勒比精品| 一区二区三区精品视频在线| 久久久久久久久免费看无码| 国产日韩欧美精品在线| 久久久久久国产精品日本| 欧美成人一区二区三区| 春色校园综合激情亚洲| 欧美精品三级在线观看| 国产一区二区三区免费在线观看| 日本久久一区二区| 免费观看成人鲁鲁鲁鲁鲁视频| frxxee中国xxx麻豆hd| 亚洲第一成人在线| 99久久精品久久亚洲精品| 一区二区三区日韩欧美精品| 久久亚洲无码视频| 亚洲精品美腿丝袜| 欧美一区二区三区粗大| 亚洲亚洲人成综合网络| 青青操在线播放| 天天综合天天综合色| 91精品少妇一区二区三区蜜桃臀| 亚洲成人综合视频| 免费黄色国产视频| 青青草97国产精品免费观看 | 视频一区在线播放| 污软件在线观看| 免费人成精品欧美精品| 一本色道**综合亚洲精品蜜桃冫| 日本欧美在线观看| 在线观看一区二区视频| 国产精品一卡二| 欧美一区二区视频观看视频| av中文字幕在线不卡| www欧美成人18+| 成年女人免费视频| 中文字幕日韩欧美一区二区三区| 双性尿奴穿贞c带憋尿| 夜夜嗨av一区二区三区网页| 亚洲精品自拍视频在线观看| 日本特黄久久久高潮| 欧美影院午夜播放| 成人av集中营| 国产亚洲午夜高清国产拍精品| 国产精品一区二区无码对白| 综合久久久久综合| 一级片黄色录像| 麻豆视频一区二区| 欧美一区二区在线视频| 69久久精品无码一区二区| 国产精品麻豆视频| 色婷婷国产精品免| 老汉av免费一区二区三区| 欧美疯狂做受xxxx富婆| 91蜜桃免费观看视频| 中文字幕一区二| 在线视频这里只有精品| 久久99在线观看| 日韩精品一区二区在线| 手机在线成人av| 亚洲国产你懂的| 欧美日韩久久不卡| 国产在线观看免费播放| 一区二区三区中文字幕精品精品 | 极品美女销魂一区二区三区 | 欧美人与性动xxxx| 在线观看免费看片| 亚洲欧美日韩精品久久久久| 久久久久久视频| 成人97人人超碰人人99| 国产精品二区一区二区aⅴ污介绍| 人人艹在线视频| 国产精品一区免费视频| 国产欧美综合在线| 亚洲女人毛茸茸高潮| 国产一区二区在线影院| 国产三级精品在线| 一本一本久久a久久| 国产成人av网站| 国产精品国产三级国产aⅴ无密码| 国精产品一区一区二区三区mba| 国产精品自拍三区| 国产精品丝袜在线| 一区二区成人免费视频| 99亚偷拍自图区亚洲| 亚洲精品乱码久久久久久黑人 | 国产盗摄一区二区| 国产精品三级电影| www欧美com| 97se狠狠狠综合亚洲狠狠| 一区二区三区在线免费视频| 欧美日韩中文字幕一区二区| 韩国三级hd两男一女| 视频一区欧美日韩| 精品福利一区二区三区免费视频| 国产123在线| 国产成人在线电影| 日韩毛片一二三区| 欧美日高清视频| 蜜臀av一区二区三区有限公司| 久久se精品一区二区| 欧美国产日本视频| 91久久精品一区二区三区| 日批视频免费看| 免费成人小视频| 国产日韩欧美麻豆| 在线视频观看一区| 亚洲久久久久久| 国产最新精品免费| 国产精品盗摄一区二区三区| 欧美性视频一区二区三区| 久久人人爽人人人人片| 韩国毛片一区二区三区| 一区免费观看视频| 欧美精品在线观看一区二区| 成年人网站免费在线观看| 国产精品1区2区| 亚洲最大的成人av| 日韩欧美成人一区二区| 日本一二三区在线观看| 性xxxxxxxxx| 久久99精品一区二区三区三区| 国产精品久久夜| 91精品婷婷国产综合久久性色 | 男人的j进女人的j一区| 日本一区二区三区视频视频| 欧亚一区二区三区| 88久久精品无码一区二区毛片| 成人性生交大片免费看视频在线| 亚洲一区在线电影| 久久久国产综合精品女国产盗摄| 91久久一区二区| 亚洲欧洲久久久| 91香蕉视频mp4| 久久精品免费看| 亚洲免费视频成人| 337p日本欧洲亚洲大胆精品| 91久久香蕉国产日韩欧美9色| 亚洲AV无码片久久精品| 91在线视频播放地址| 久久精品国产精品亚洲红杏| 亚洲欧美偷拍卡通变态| 2023国产精品| 欧美日韩国产一级片| 天天色影综合网|