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

主頁 > 知識庫 > 解析Go的Waitgroup和鎖的問題

解析Go的Waitgroup和鎖的問題

熱門標簽:開通400電話申請流程 400手機電話免費辦理 武漢百應人工智能電銷機器人 如何利用高德地圖標注家 上海企業外呼系統排名 電腦外呼系統輻射大嗎 揚州電銷外呼系統軟件 百度地圖標注位置網站 智能語音電銷的機器人

學 Go 的時候知道 Go 語言支持并發,最簡單的方法是通過 go 關鍵字開啟 goroutine 即可。可在工作中,用的是 sync 包的 WaitGroup,然而這樣還不夠,當多個 goroutine 同時訪問一個變量時,還要考慮如何保證這些 goroutine 之間不會相互影響,這就又使用到了 sync 的 Mutex。它們是如何串起來的呢?

一、Goroutinue

先說 goroutine,我們都知道它是 Go 中的輕量級線程。Go 程序從 main 包的 main() 函數開始,在程序啟動時,Go 程序就會為 main() 函數創建一個默認的 goroutine。使用 goroutine,使用關鍵字 go 即可。

package main
import (
    "fmt"
)
func main() {
    // 并發執行程序
    go running()
}
func running() {
    fmt.Println("Goroutine")
}

執行代碼會發現沒有我們預期的“Goroutine”輸出,這是因為當前的程序是一個單線程的程序,main 函數只要執行后,就不會再管其他線程在做什么事情,程序就自動退出了。解決辦法是加一個 sleep 函數,讓 main 函數等待 running 函數執行完畢后再退出。我們假設 running 函數里的代碼執行需要 2 秒,因此讓 main 函數等待 3 秒再退出。

package main
import (
    "fmt"
    "time"
)
func main() {
    // 并發執行程序
    go running()
    time.Sleep(3 * time.Second)
}
func running() {
    fmt.Println("Goroutine")
}

再次執行代碼,終端輸出了我們想要的“Goroutine”字符串。

二、WaitGroup

上面我們是假設了 running 函數執行需要 2 秒,可如果執行需要 10 秒甚至更長時間,不知道 goroutin 什么時候結束,難道還要 main 函數 sleep 更多的秒數嗎?就不能讓 running 函數執行完去通知 main 函數,main 函數收到信號自動退出嗎?還真可以!可以使用 sync 包的 Waitgroup 判斷一組任務是否完成。

WatiGroup 能夠一直等到所有的 goroutine 執行完成,并且阻塞主線程的執行,直到所有的 goroutine 執行完成。它有 3 個方法:

  • Add():給計數器添加等待 goroutine 的數量。
  • Done():減少 WaitGroup 計數器的值,應在協程的最后執行。
  • Wait():執行阻塞,直到所有的 WaitGroup 數量變成 0

一個簡單的示例如下:

package main 
import ( 
    "fmt” 
    "sync” 
    “time"
) 

func process(i int, wg *sync.WaitGroup) { 
    fmt.Println("started Goroutine ", i) 
    time.Sleep(2 * time.Second) 
    fmt.Printf("Goroutine %d ended\n", i) 
    wg.Done() 
} 

func main() { 
    var wg sync.WaitGroup 
    for i := 0; i  3; i++ { 
        wg.Add(1) 
        go process(i, wg) 
    } 
    wg.Wait() 
    fmt.Println("All go routines finished executing”) 
}
//main函數也可以寫成如下方式
func main() {
    var wg sync.WaitGroup
    wg.Add(3) //設置計數器,數值即為goroutine的個數
    go process(1, wg)
    go process(2, wg)
    go process(3, wg)
    wg.Wait() //主goroutine阻塞等待計數器變為0
    fmt.Println("All goroutines finished executing")
}

命令行輸出如下:

deer@192 src % go run hello.go //第1次
started Goroutine  3
started Goroutine  1
started Goroutine  2
Goroutine 2 ended
Goroutine 1 ended
Goroutine 3 ended
All goroutines finished executing

deer@192 src % go run hello.go //第2次
started Goroutine  3
started Goroutine  1
started Goroutine  2
Goroutine 1 ended
Goroutine 2 ended
Goroutine 3 ended
All goroutines finished executing

deer@192 src % go run hello.go //第3次
started Goroutine  3
started Goroutine  2
started Goroutine  1
Goroutine 3 ended
Goroutine 1 ended
Goroutine 2 ended
All goroutines finished executing

簡單的說,上面程序中 wg 內部維護了一個計數器,激活了 3 個 goroutine:
1)每次激活 goroutine 之前,都先調用 Add() 方法增加一個需要等待的 goroutine 計數。
2)每個 goroutine 都運行 process() 函數,這個函數在執行完成時需要調用 Done() 方法來表示 goroutine 的結束。
3)激活 3 個 goroutine 后,main 的 goroutine 會執行到 Wait(),由于每個激活的 goroutine 運行的 process() 都需要睡眠 2 秒,所以 main 的 goroutine 在 Wait() 這里會阻塞一段時間(大約2秒),
4)當所有 goroutine 都完成后,計數器減為 0,Wait() 將不再阻塞,于是 main 的 goroutine 得以執行后面的 Println()。

這里需要注意:
1)process() 中使用指針類型的 *sync.WaitGroup 作為參數,表示這 3 個 goroutine 共享一個 wg,才能知道這 3 個 goroutine 都完成了。如果這里使用值類型的 sync.WaitGroup 作為參數,意味著每個 goroutine 都拷貝一份 wg,每個 goroutine 都使用自己的 wg,main goroutine將會永久阻塞而導致產生死鎖。
2)Add() 設置的數量必須與實際等待的 goroutine 個數一致,也就是和Done的調用數量必須相等,否則會panic,報錯信息如下:

fatal error: all goroutines are asleep - deadlock!

三、鎖

當多個 goroutine 同時操作一個變量時,會存在數據競爭,導致最后的結果與期待的不符,解決辦法就是加鎖。Go 中的 sync 包 實現了兩種鎖:Mutex 和 RWMutex,前者為互斥鎖,后者為讀寫鎖,基于 Mutex 實現。當我們的場景是寫操作為主時,可以使用 Mutex 來加鎖、解鎖。

var lock sync.Mutex //聲明一個互斥鎖
 lock.Lock() //加鎖
//code...
 lock.Unlock() //解鎖

互斥鎖其實就是每個線程在對資源操作前都嘗試先加鎖,成功加鎖才能操作,操作結束后再解鎖。也就是說,使用了互斥鎖,同一時刻只能有一個 goroutine 在執行。

以上就是解析Go的Waitgroup和鎖的問題的詳細內容,更多關于Go的Waitgroup和鎖的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • go 實現簡易端口掃描的示例
  • go xorm框架的使用
  • Go語言快速入門圖文教程
  • go語言基礎 seek光標位置os包的使用
  • Go語言獲取文件的名稱、前綴、后綴
  • Go語言 如何實現RSA加密解密
  • Go 自定義package包設置與導入操作
  • 詳解Gotorch多機定時任務管理系統

標簽:江西 黑龍江 張掖 武漢 宜賓 延邊 嘉峪關 新余

巨人網絡通訊聲明:本文標題《解析Go的Waitgroup和鎖的問題》,本文關鍵詞  解析,的,Waitgroup,和,鎖,問題,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《解析Go的Waitgroup和鎖的問題》相關的同類信息!
  • 本頁收集關于解析Go的Waitgroup和鎖的問題的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    337p粉嫩大胆色噜噜噜噜亚洲| 成人综合婷婷国产精品久久免费| 国产999精品久久| 欧美色图激情小说| 岛国av在线一区| 免费在线观看一区| 亚洲精品日日夜夜| 久久久久久毛片| 欧美精品乱人伦久久久久久| 蜜臀av性久久久久蜜臀av麻豆| 国产精品国产自产拍在线| 精品国产免费人成电影在线观看四季 | 欧美国产日韩一二三区| 欧美精品 国产精品| 99久久精品国产一区二区三区| 精品一区二区在线观看| 日日欢夜夜爽一区| 欧美电影免费观看高清完整版| 久久精品国产澳门| 极品美女销魂一区二区三区 | 欧美岛国在线观看| 欧美精品一区二区高清在线观看 | 国产99久久精品| 国产一区二区电影| 成人看片黄a免费看在线| 成人性视频免费网站| 成人少妇影院yyyy| 91在线精品一区二区三区| 91蜜桃婷婷狠狠久久综合9色| www.在线欧美| 91日韩在线专区| 91高清在线观看| 91精品国产乱码久久蜜臀| 91精品国产91热久久久做人人| 欧美丰满美乳xxx高潮www| 精品视频免费在线| 欧美日韩国产首页在线观看| 91视频精品在这里| 国内成人自拍视频| 成人网在线免费视频| 国产乱人伦偷精品视频不卡 | 日本不卡视频在线观看| 99视频一区二区三区| 在线中文字幕一区| 99精品久久只有精品| 国产乱码字幕精品高清av| av中文字幕不卡| 不卡视频免费播放| 欧美国产97人人爽人人喊| 久久久精品综合| 亚洲男同性恋视频| 中文字幕一区不卡| 无码av中文一区二区三区桃花岛| 亚洲一区二区三区四区的 | 在线视频国内自拍亚洲视频| 成人美女在线观看| 9人人澡人人爽人人精品| 欧美日韩国产乱码电影| 91国产成人在线| 精品国产髙清在线看国产毛片| xfplay精品久久| 久久久久久毛片| 国产在线麻豆精品观看| 日韩成人精品在线| 成人aa视频在线观看| 一区二区三区在线播放| 国产女人aaa级久久久级| 盗摄精品av一区二区三区| 美女视频免费一区| 色婷婷精品大在线视频| 欧美成人精品高清在线播放 | 日本在线观看不卡视频| 成人一区在线观看| 色婷婷av一区二区三区软件| 久久只精品国产| 亚洲视频你懂的| 精品区一区二区| 国产精品女同互慰在线看| 亚洲高清三级视频| 91免费在线视频观看| 欧美人妖巨大在线| 久久久久高清精品| 麻豆精品国产91久久久久久| 成人晚上爱看视频| 蜜桃av一区二区在线观看| 亚洲成人www| 精品一区二区三区在线观看| av福利精品导航| 欧美人牲a欧美精品| 精品国产乱码久久久久久图片 | 亚洲品质自拍视频| 春色校园综合激情亚洲| 欧美一区二区三区视频在线观看 | 亚洲精品写真福利| hitomi一区二区三区精品| 欧美久久一二三四区| 一区在线播放视频| 美女脱光内衣内裤视频久久网站| 欧美巨大另类极品videosbest | 国产高清精品在线| 欧美日韩性生活| 一区二区三国产精华液| www.亚洲色图.com| 91精品国产欧美一区二区18| 艳妇臀荡乳欲伦亚洲一区| 全国精品久久少妇| 欧美在线影院一区二区| 韩国av一区二区三区四区| 欧美一区二区黄| 99re这里只有精品视频首页| 91色.com| 久久av资源网| 美女视频黄免费的久久| 亚洲国产成人av| 一本一道综合狠狠老| 亚洲欧洲av在线| 国产福利一区二区三区视频 | 欧美一区二区三区四区视频| 亚洲综合免费观看高清在线观看| 国产成人啪免费观看软件| www.欧美.com| 久久久久久毛片| 久久成人麻豆午夜电影| 亚洲高清在线精品| 国产精品免费久久| 欧美成人激情免费网| av网站一区二区三区| 国产一区啦啦啦在线观看| 国产精品欧美经典| 亚洲精品乱码久久久久久黑人| 国产精品系列在线观看| 色婷婷亚洲婷婷| 中文字幕亚洲在| 国产精品乱码人人做人人爱| 亚洲影视在线播放| 麻豆精品视频在线观看| 亚洲精品日产精品乱码不卡| 91麻豆精东视频| 2023国产一二三区日本精品2022| 99精品热视频| 日本道在线观看一区二区| 国产精品成人免费| 欧美喷潮久久久xxxxx| 成人免费在线视频| 岛国av在线一区| 国产精品自拍三区| 免费人成黄页网站在线一区二区| 日本一区二区三区高清不卡| 久久婷婷国产综合国色天香| 国产精品日韩精品欧美在线| 亚洲一区二区美女| 中文字幕在线不卡视频| 麻豆视频一区二区| 精品国产青草久久久久福利| 国产亚洲福利社区一区| 日韩电影在线看| 奇米精品一区二区三区四区| 亚洲女人****多毛耸耸8| 精品美女一区二区三区| 欧美电影免费观看完整版| 日韩国产欧美三级| 国产不卡高清在线观看视频| 久久久久久**毛片大全| 五月天亚洲精品| 色综合天天综合在线视频| 久久精品国产成人一区二区三区| 欧美理论片在线| 欧美午夜精品免费| 国产精品美女一区二区三区| 亚洲精品在线电影| 成人晚上爱看视频| 一区二区三区av电影| eeuss国产一区二区三区| 精品国产一区久久| 国产精品亚洲第一区在线暖暖韩国 | 91精品国产一区二区三区| 国产精品久久看| 51午夜精品国产| 91免费视频大全| 成人午夜视频免费看| 日韩av在线发布| 亚洲综合激情小说| 国产色91在线| 国产欧美精品一区二区三区四区 | 国产精品久久久久天堂| 国产999精品久久| 乱中年女人伦av一区二区| 毛片av一区二区| 亚洲一区二区三区四区五区中文 | 91精品国产美女浴室洗澡无遮挡| 久久日一线二线三线suv| 国产精品免费人成网站| 欧美三级中文字| 老司机精品视频一区二区三区| 精品国产麻豆免费人成网站| 欧美一区二区久久久| 国产精品夜夜爽| 亚洲图片欧美视频| 国产欧美视频一区二区| 欧美片在线播放|