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

主頁 > 知識庫 > 在golang中使用Sync.WaitGroup解決等待的問題

在golang中使用Sync.WaitGroup解決等待的問題

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

面對goroutine我們都需要等待它完成交給它的事情,等待它計(jì)算完成或是執(zhí)行完畢,所以不得不在程序需要等待的地方使用time.Sleep()來睡眠一段時(shí)間,等待其他goroytine執(zhí)行完畢,下面的代碼打印1到100的for循環(huán)可以在很快的時(shí)間內(nèi)運(yùn)行完畢,但是我們必須添加time.Sleep()來等待其打印完畢,如果我們不等待仿佛什么也沒有發(fā)生一樣。。。。。這肯定不是我們想要的!

func main(){
    for i := 0; i  100 ; i++{
        go fmt.Println(i)
    }
    time.Sleep(time.Second)
}

這就是我最開始學(xué)習(xí)goroutine想到的笨方法。。。。死等! 等不到 time.Second*2 在等不到*3

但是對于我們實(shí)際的使用場景來說,1秒也許等待的時(shí)間有點(diǎn)長,而有時(shí)候是遠(yuǎn)遠(yuǎn)不夠的,最主要的我們無法預(yù)知gorotine的運(yùn)行時(shí)間長短,所以也無法指定Sleep睡眠的時(shí)間。

正好前幾天學(xué)習(xí)了channel,那么現(xiàn)在我們就可以

使用channel來達(dá)到我們的目的了

func main() {
    c := make(chan bool, 100)
    for i := 0; i  100; i++ {
        go func(i int) {
            fmt.Println(i)
            c - true
        }(i)
    }
 
    for i := 0; i  100; i++ {
        -c
    }
}

完美輸出!這里我們可以從控制臺(tái)看到我們的勝利成果,但是我們有更好的處理方式:sync.WaitGroup

WaitGroup對象內(nèi)部有一個(gè)計(jì)數(shù)器,最初從0開始,它有三個(gè)方法:Add() Done() Wait() 用來控制計(jì)數(shù)器的數(shù)量從而達(dá)到等待的目的。

func main() {
   wg := sync.WaitGroup{}
   wg.Add(100)
   for i := 0; i  100; i++ {
      go func(i int) {
         defer wg.Done()
         fmt.Print(i)
      }(i)
   }
   wg.Wait()
}

首先使用 add(100) 把計(jì)數(shù)器的數(shù)量設(shè)置為100,每次循環(huán)運(yùn)行完畢都把計(jì)數(shù)器減1,主函數(shù)使用Wait()

阻塞,直到計(jì)數(shù)器歸0結(jié)束主線程結(jié)束阻塞。

這里會(huì)阻塞主線程!!!需要注意。

另外:以上三種方式打印出的數(shù)字皆無序

type WaitGroup struct {
 noCopy noCopy
 state1 [3]uint32
}

它只是一個(gè)struct所以當(dāng)參數(shù)傳遞的時(shí)候需要傳遞指針。

補(bǔ)充:sync.WaitGroup的錯(cuò)誤用法與糾正

本文主要是記錄在學(xué)習(xí)golang語言過程中錯(cuò)誤使用sync.WaitGroup以及指針引起的報(bào)錯(cuò),并且糾正過程。

1.錯(cuò)誤使用場景

main包的實(shí)現(xiàn)內(nèi)容:

package main
import (
    "fmt"
    "pressure/game"
    "sync"
)
var waitGroup sync.WaitGroup //定義一個(gè)同步等待的組
func main(){
    waitGroup.Add(1) //添加一個(gè)計(jì)數(shù)
    go game.ConnSocket(serverAddr, waitGroup) //調(diào)用其他包的方法執(zhí)行任務(wù)
    waitGroup.Wait() //阻塞直到所有任務(wù)完成
    fmt.Println("main DONE!!!")
}

如下是game包的內(nèi)容:

package game
import (
    "fmt"
    "net"
    "strconv"
    "strings"
    "sync"
)
var gameWait sync.WaitGroup
func ConnSocket(serverAddr string, wait sync.WaitGroup) {
    var err error
    Conn, err = net.Dial("tcp", serverAddr)
    if err != nil {
        fmt.Println("Error connected:", err.Error())
        wait.Done()
        return
    }
    gameWait = wait
    fmt.Println("connected OK:", Conn.RemoteAddr())
    go readMessage()
}
func readMessage() {
    fmt.Println("readMessage:")
    for {
        if OK:=dosomething(),OK{
            gameWait.Done()
        }
    }
}

然后執(zhí)行如上的代碼,會(huì)出現(xiàn)報(bào)錯(cuò):

panic: sync: negative WaitGroup counter

goroutine 12 [running]:

sync.(*WaitGroup).Add(0x7b8b90, 0xffffffffffffffff)

D:/Program Files/Go/src/sync/waitgroup.go:75 +0x1d0

sync.(*WaitGroup).Done(0x7b8b90)

原因:

func ConnSocket(serverAddr string, wait sync.WaitGroup)只是把sync.WaitGroup的值傳遞過來,而非內(nèi)存地址,所以在賦值給gameWait的時(shí)候也只是賦值了值,gameWait并非指向的main里的waitGroup 的內(nèi)存地址,導(dǎo)致 gameWait.Done()的時(shí)候并沒有獲取到main里的計(jì)數(shù)1,所以才會(huì)報(bào)負(fù)數(shù)。究其原因還是沒有對指針的理解。所以針對上面的問題做了修改。

2.正確的使用

main包的實(shí)現(xiàn)內(nèi)容:

package main
import (
    "fmt"
    "pressure/game"
    "sync"
)
var waitGroup sync.WaitGroup //定義一個(gè)同步等待的組
func main(){
    waitGroup.Add(1) //添加一個(gè)計(jì)數(shù)
    //這里傳遞waitGroup的內(nèi)存地址
    go game.ConnSocket(serverAddr, waitGroup) //調(diào)用其他包的方法執(zhí)行任務(wù)
    waitGroup.Wait() //阻塞直到所有任務(wù)完成
    fmt.Println("main DONE!!!")
}

如下是game包的內(nèi)容:

package game
import (
    "fmt"
    "net"
    "strconv"
    "strings"
    "sync"
)
var gameWait *sync.WaitGroup//此處也申明為指針變量
//參數(shù)傳遞為指針傳遞*sync.WaitGroup,即wait 指向的是main里的waitGroup的內(nèi)存地址
func ConnSocket(serverAddr string, wait *sync.WaitGroup) {
    var err error
    Conn, err = net.Dial("tcp", serverAddr)
    if err != nil {
        fmt.Println("Error connected:", err.Error())
        wait.Done()
        return
    }
    gameWait = wait//指針指向另一個(gè)指針,這樣就做到了gameWait指向的是wait的地址,所以gameWait修改wait的內(nèi)存地址鎖存貯的值也會(huì)跟隨改變
    fmt.Println("connected OK:", Conn.RemoteAddr())
    go readMessage()
}
func readMessage() {
    fmt.Println("readMessage:")
    for {
        if OK:=dosomething(),OK{
            gameWait.Done()
        }
    }
}

3.結(jié)果

還是對指針傳遞以及值傳遞理解不夠透徹才會(huì)出現(xiàn)如此問題,因此還需要多針對指針進(jìn)行學(xué)習(xí)與理解。以防在以后的工作中出現(xiàn)類似問題。

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

您可能感興趣的文章:
  • 解決Golang 中使用WaitGroup的那點(diǎn)坑
  • 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中使用Sync.WaitGroup解決等待的問題》,本文關(guān)鍵詞  在,golang,中,使用,Sync.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中使用Sync.WaitGroup解決等待的問題》相關(guān)的同類信息!
  • 本頁收集關(guān)于在golang中使用Sync.WaitGroup解決等待的問題的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲成av人综合在线观看| 亚洲男人的天堂av| 日本不卡视频在线| 欧美性videosxxxxx| 亚洲天堂av一区| 国产精品主播直播| 国产偷国产偷亚洲高清人白洁| 久久精品国产免费| 欧美精品一区二区三区在线 | 日韩专区一卡二卡| 91精品国产91久久久久久最新毛片 | 成人网在线播放| 中文字幕亚洲综合久久菠萝蜜| 大美女一区二区三区| 国产精品情趣视频| 丝袜美腿亚洲色图| 国产日韩欧美精品一区| 精品国产乱码久久| 日韩欧美色综合网站| 97精品超碰一区二区三区| 国产女人水真多18毛片18精品视频 | 九九久久精品视频| 国产色产综合产在线视频| 99国产精品久久久久久久久久久| 日本伊人午夜精品| 日韩欧美一区中文| 国产麻豆精品久久一二三| 国产精品视频免费| 欧美日韩一级片网站| 开心九九激情九九欧美日韩精美视频电影| 久久精品亚洲麻豆av一区二区| 国产高清无密码一区二区三区| 国产精品久久久久影院亚瑟| 欧美日韩精品一区二区在线播放| 亚洲影院久久精品| 久久久电影一区二区三区| 欧美精品粉嫩高潮一区二区| 99这里只有久久精品视频| 免费成人性网站| 亚洲黄网站在线观看| 亚洲精品一区二区三区福利| 91精品国产欧美一区二区成人 | 国产精品一区在线观看你懂的| 亚洲欧美激情一区二区| 欧美精品一区二区久久久| 欧美日韩国产片| 色综合中文字幕国产| 国产福利一区在线| 九九九精品视频| 美女mm1313爽爽久久久蜜臀| 亚洲国产一区二区在线播放| 国产女主播在线一区二区| 欧美一区二区不卡视频| 色哟哟在线观看一区二区三区| 国产黄色91视频| 日韩国产高清影视| 自拍偷拍亚洲欧美日韩| 91精品蜜臀在线一区尤物| 99久久伊人精品| 91高清在线观看| 免费观看一级特黄欧美大片| 激情国产一区二区| 国产欧美日韩久久| 91麻豆国产精品久久| 国产精品人成在线观看免费| 国产精品麻豆网站| 色欧美乱欧美15图片| 中文子幕无线码一区tr| 成人免费福利片| 久久精品欧美一区二区三区不卡| 欧美成人r级一区二区三区| 国产河南妇女毛片精品久久久| 国产精品久久久久久久久快鸭| av激情成人网| 奇米亚洲午夜久久精品| 中文子幕无线码一区tr| 91麻豆精品国产91久久久久久久久 | 色综合亚洲欧洲| 午夜日韩在线观看| 久久久久久久久久久黄色| 91麻豆成人久久精品二区三区| 免费欧美在线视频| 亚洲桃色在线一区| 日韩电影在线一区二区| 亚洲色图制服丝袜| 日韩欧美成人午夜| 欧美在线视频日韩| 丁香五精品蜜臀久久久久99网站 | 欧美日韩国产在线观看| 777午夜精品免费视频| 色综合久久天天| 久久福利视频一区二区| 天堂资源在线中文精品| 国产精品久久久久久久久搜平片| 日韩午夜av一区| 欧美性受xxxx黑人xyx性爽| 白白色亚洲国产精品| 国产成人综合自拍| 亚洲精品成a人| 国产综合一区二区| 另类专区欧美蜜桃臀第一页| 午夜电影一区二区| 亚洲精品久久嫩草网站秘色| 久久精品欧美一区二区三区麻豆| 日韩欧美一级特黄在线播放| 666欧美在线视频| 91精品国产综合久久精品| 国产一区在线不卡| 97精品国产露脸对白| 91天堂素人约啪| 99riav久久精品riav| 日本韩国一区二区三区| 99久久99精品久久久久久| 成人av电影免费观看| 成人午夜视频网站| 丝袜美腿成人在线| 在线日韩一区二区| 8v天堂国产在线一区二区| 日韩亚洲欧美中文三级| 2020国产精品久久精品美国| 久久精品一区八戒影视| 中文字幕在线不卡国产视频| 中文字幕在线观看不卡视频| 777午夜精品免费视频| 亚洲自拍偷拍图区| 日本欧美在线观看| 精品亚洲成a人| 99精品国产一区二区三区不卡| av男人天堂一区| 欧美视频精品在线| 91精品国产综合久久小美女| 91视频免费看| 亚洲特级片在线| 日本色综合中文字幕| 国产成人免费视频网站高清观看视频| 韩日欧美一区二区三区| 97久久人人超碰| 972aa.com艺术欧美| 在线成人小视频| 日本一区二区三区dvd视频在线| 日韩欧美不卡在线观看视频| 亚洲va欧美va人人爽| 国产乱码精品一区二区三| 91麻豆国产福利在线观看| 日韩一区和二区| 亚洲欧洲精品天堂一级| 男女视频一区二区| 99精品视频在线观看| 久久国产欧美日韩精品| 久久人人爽人人爽| 亚洲第一福利视频在线| 国产suv精品一区二区883| 97超碰欧美中文字幕| 日韩精品一区二区三区四区| 国产精品色在线观看| 日韩精品成人一区二区三区| 成人免费视频app| 欧美一级片在线| 亚洲乱码国产乱码精品精可以看| 国产午夜精品久久| 欧美亚洲国产怡红院影院| 欧美高清在线一区| 美国三级日本三级久久99| 色综合久久天天| 中文字幕二三区不卡| 久色婷婷小香蕉久久| 久国产精品韩国三级视频| 中文字幕+乱码+中文字幕一区| 免费在线一区观看| 欧美亚男人的天堂| 欧美日韩亚洲丝袜制服| 亚洲视频在线一区二区| 成人免费视频app| 日本一区二区三区四区在线视频| 国产在线一区观看| 久久电影网站中文字幕 | 爽好多水快深点欧美视频| 粉嫩高潮美女一区二区三区 | 午夜精品影院在线观看| 成人黄色免费短视频| 精品国产一区二区精华| 欧美bbbbb| 精品少妇一区二区三区在线视频| 午夜天堂影视香蕉久久| 欧美亚洲国产bt| 久久理论电影网| 91精品婷婷国产综合久久性色| 午夜一区二区三区视频| 欧美三级三级三级| 日韩精品国产精品| 欧美成人一级视频| 国产美女精品人人做人人爽| 一区二区三区在线视频播放| √…a在线天堂一区| 久久久久久久久岛国免费| 国产传媒日韩欧美成人| 中文字幕日韩av资源站| 在线观看亚洲a| 天天操天天干天天综合网| 白白色 亚洲乱淫|