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

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

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

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

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

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

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

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

正好前幾天學習了channel,那么現在我們就可以

使用channel來達到我們的目的了

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
    }
}

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

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

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) 把計數器的數量設置為100,每次循環運行完畢都把計數器減1,主函數使用Wait()

阻塞,直到計數器歸0結束主線程結束阻塞。

這里會阻塞主線程!!!需要注意。

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

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

它只是一個struct所以當參數傳遞的時候需要傳遞指針。

補充:sync.WaitGroup的錯誤用法與糾正

本文主要是記錄在學習golang語言過程中錯誤使用sync.WaitGroup以及指針引起的報錯,并且糾正過程。

1.錯誤使用場景

main包的實現內容:

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

如下是game包的內容:

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()
        }
    }
}

然后執行如上的代碼,會出現報錯:

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的值傳遞過來,而非內存地址,所以在賦值給gameWait的時候也只是賦值了值,gameWait并非指向的main里的waitGroup 的內存地址,導致 gameWait.Done()的時候并沒有獲取到main里的計數1,所以才會報負數。究其原因還是沒有對指針的理解。所以針對上面的問題做了修改。

2.正確的使用

main包的實現內容:

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

如下是game包的內容:

package game
import (
    "fmt"
    "net"
    "strconv"
    "strings"
    "sync"
)
var gameWait *sync.WaitGroup//此處也申明為指針變量
//參數傳遞為指針傳遞*sync.WaitGroup,即wait 指向的是main里的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//指針指向另一個指針,這樣就做到了gameWait指向的是wait的地址,所以gameWait修改wait的內存地址鎖存貯的值也會跟隨改變
    fmt.Println("connected OK:", Conn.RemoteAddr())
    go readMessage()
}
func readMessage() {
    fmt.Println("readMessage:")
    for {
        if OK:=dosomething(),OK{
            gameWait.Done()
        }
    }
}

3.結果

還是對指針傳遞以及值傳遞理解不夠透徹才會出現如此問題,因此還需要多針對指針進行學習與理解。以防在以后的工作中出現類似問題。

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

您可能感興趣的文章:
  • 解決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
    久久综合久久综合亚洲| 国产人成亚洲第一网站在线播放| 亚洲一区影音先锋| 久久毛片高清国产| 在线免费观看视频一区| 中文字幕在线不卡| 99在线视频精品| 韩国成人在线视频| 亚洲一二三区在线观看| 亚洲精品高清在线观看| 亚洲美女一区二区三区| 亚洲三级小视频| 亚洲国产欧美日韩另类综合| 一区二区免费视频| 婷婷成人综合网| 一区二区三区日韩| 午夜伦理一区二区| 九九**精品视频免费播放| 久久国产乱子精品免费女| 日韩精品一级二级 | 日韩精品一区二区三区视频播放 | 亚洲欧洲一区二区在线播放| 国产亚洲一区二区三区在线观看| 国产午夜亚洲精品不卡| 亚洲日本在线天堂| 美日韩一区二区| 不卡一区二区在线| 欧美日韩国产片| 日本一区二区在线不卡| 天天综合网天天综合色| 福利一区二区在线观看| 日本精品视频一区二区| 久久一二三国产| 日日摸夜夜添夜夜添精品视频 | 欧美电影影音先锋| 亚洲卡通欧美制服中文| 极品销魂美女一区二区三区| 一本久道久久综合中文字幕| 日韩视频永久免费| 日欧美一区二区| 日韩欧美视频在线| 亚洲影视资源网| 不卡在线视频中文字幕| 国产精品国产三级国产有无不卡 | 欧美极品xxx| 国产成人av一区二区三区在线| 日韩一区二区在线观看| 亚洲动漫第一页| 精品盗摄一区二区三区| 国产伦精品一区二区三区免费 | 欧美精品第1页| 日韩专区一卡二卡| 日韩免费看网站| 久久精品国产免费| 国产精品人成在线观看免费| 国产在线国偷精品免费看| 中文字幕乱码久久午夜不卡 | 成人av综合在线| 欧美久久久一区| 毛片一区二区三区| 国产精品盗摄一区二区三区| 成人午夜视频网站| 亚洲一卡二卡三卡四卡无卡久久| 欧美日本不卡视频| 丁香亚洲综合激情啪啪综合| 亚洲国产精品自拍| 日本一区二区综合亚洲| 制服丝袜激情欧洲亚洲| 色欧美乱欧美15图片| 蜜桃一区二区三区在线| 亚洲影视在线播放| 中文字幕日韩精品一区| 久久亚洲影视婷婷| 日韩一本二本av| 欧美日韩国产免费| 欧美中文字幕一区二区三区亚洲| 成人免费va视频| 国产在线精品一区二区| 国产乱妇无码大片在线观看| 亚洲综合色区另类av| 亚洲激情自拍偷拍| 一区二区成人在线| 日欧美一区二区| 亚洲成av人片一区二区三区| 亚洲美女精品一区| 亚洲欧美日韩精品久久久久| 中文字幕欧美国产| 亚洲久草在线视频| 美女视频一区二区| 国产91对白在线观看九色| 国产不卡视频一区| 99国产精品久| 精品国产青草久久久久福利| 久久色在线观看| 综合激情成人伊人| 蜜臀91精品一区二区三区| 国产乱色国产精品免费视频| 99久久免费国产| 91精品国产综合久久精品图片| 久久久久久**毛片大全| 亚欧色一区w666天堂| 国产精华液一区二区三区| 一本到不卡免费一区二区| 日韩一区二区三区电影在线观看| 久久精品欧美日韩精品| 一区二区国产视频| 91蝌蚪国产九色| 国产精品天干天干在线综合| 奇米在线7777在线精品| 欧美日韩高清一区二区三区| 亚洲欧洲成人自拍| 成人av动漫网站| 精品国产伦一区二区三区观看方式 | 国产精品911| 欧美一区二区福利视频| 亚洲色图欧美在线| 99r精品视频| 亚洲自拍另类综合| 欧美日韩亚洲丝袜制服| 五月婷婷色综合| 在线电影院国产精品| 偷拍日韩校园综合在线| 欧美精品aⅴ在线视频| 日韩 欧美一区二区三区| 91精品欧美福利在线观看| 午夜精品久久久久久久99樱桃| 欧美日韩精品一区二区三区| 蜜臀av一区二区| 国产精品美女视频| 99久久精品国产网站| 国产日产亚洲精品系列| 欧美亚洲另类激情小说| 亚洲18影院在线观看| 欧美精品aⅴ在线视频| 极品尤物av久久免费看| 综合精品久久久| 日韩免费观看高清完整版在线观看| 激情偷乱视频一区二区三区| 日韩伦理电影网| 日韩视频免费观看高清完整版 | 国产一区二区女| 亚洲国产中文字幕在线视频综合| 91麻豆精品91久久久久久清纯| 国产精品小仙女| 偷拍亚洲欧洲综合| 91精品国产综合久久久蜜臀图片| 蜜臀av性久久久久蜜臀aⅴ流畅| ...中文天堂在线一区| 久久综合九色综合97婷婷| 欧美三级电影在线观看| 久久奇米777| 亚洲高清视频中文字幕| 国产成人综合自拍| 日韩一卡二卡三卡四卡| 自拍偷拍欧美激情| 激情国产一区二区| 在线播放国产精品二区一二区四区 | 亚洲精品国久久99热| 国产高清一区日本| 久久综合久色欧美综合狠狠| 亚洲国产精品一区二区久久 | 国产精品1区2区| 精品国产乱码久久久久久久久 | 欧美性猛片aaaaaaa做受| 中文字幕制服丝袜成人av| 精彩视频一区二区| 久久久久久久综合日本| 久久99精品国产麻豆婷婷| 欧美日韩aaaaa| 国产在线观看一区二区| 久久伊人中文字幕| 91色.com| 午夜精品久久久久影视| 精品久久人人做人人爱| 国产麻豆精品theporn| 国产精品久久久99| 欧美日韩高清一区二区不卡 | 久久www免费人成看片高清| 久久亚洲二区三区| 欧美影院午夜播放| 日本亚洲电影天堂| 自拍偷在线精品自拍偷无码专区| 在线看国产一区| 久久国产精品99久久久久久老狼 | 欧美视频日韩视频| 美女www一区二区| 亚洲天堂成人在线观看| 欧美剧在线免费观看网站| 福利一区在线观看| 日本在线不卡视频一二三区| 国产日韩欧美激情| 在线播放视频一区| 欧美在线不卡视频| 国产激情视频一区二区三区欧美| 亚洲激情在线播放| 亚洲日本电影在线| 中文字幕欧美日韩一区| 中文子幕无线码一区tr| 精品剧情在线观看| 精品日韩一区二区三区|