成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

一文聊聊Go語言中資源競爭問題

一文聊聊Go語言中資源競爭問題

我們都知道,在并發編程中,線程安全是非常重要的。接下來我們就假定一個場景,復現一下線程不安全的情況,再聊聊如何在Go中解決

場景

我們現在需要對1~100求他們的階乘,并將結果放到一個map中

1! = 1 = 1 2! = 1 * 2 = 2 3! = 1 * 2 * 3 = 6 4! = 1 * 2 * 3 * 4 = 24 5! = 1 * 2 * 3 * 4 * 5 = 120 ... {     1: 1     2: 2     3: 6     4: 24     5: 120     ... }
登錄后復制

代碼實現

var factorialMap = make(map[int]int)  func Factorial(n int) {     result := 1     for i := 1; i <= n; i++ {         result *= i     }     factorialMap[n] = result }  func main() {     for i := 1; i < 10; i++ {         Factorial(i)     }     for k, v := range factorialMap {         fmt.Printf("%d 的階乘是%dn", k, v)     } }
登錄后復制

一文聊聊Go語言中資源競爭問題上述代碼執行結果其實是沒問題的,為什么會出現亂序呢?因為這是go語言中map其實就是亂序的,按照我們的理解,先存的先出,但是不好意思,Golang的map不是這樣的。 上面執行也沒什么問題啊,細心的同學可能發現了,這個版本的代碼并沒有用上并發,對吧。好接下來我們繼續改進

并發實現

var factorialMap = make(map[int]int)  func Factorial(n int) {     result := 1     for i := 1; i <= n; i++ {         result *= i     }     factorialMap[n] = result }  func main() {     for i := 1; i < 10; i++ {         go Factorial(i)     }     for k, v := range factorialMap {         fmt.Printf("%d 的階乘是%dn", k, v)     } }
登錄后復制

一文聊聊Go語言中資源競爭問題我們可以發現,并發版就是在調用計算階乘函數的前面加上了一個go而已。不要小看這個go,扯遠了,當然大家知道這是go語言中開啟一個協程的關鍵字即可。

執行結果就是,控制臺啥都沒輸出,這是因為主協程和子協程之間的執行關系,下面我們畫圖理解

一文聊聊Go語言中資源競爭問題從上圖中我們可以發現,主協程執行的時間短(表現在比較短),子協程執行時間比較長(表現在比較長) 我們一定要記住,子協程是相對于當前的主協程來說的,如果主協程不存在了,那就沒有子協程了

所以上面代碼啥都沒輸出就是因為,主協程已經執行完了,但是子協程還沒做完,那子協程都沒做完,factorialMap中能有東西嗎?

主等子

這就引出我們第一個問題,主協程如何等待子協程執行完再退出程序。我們現在用一個最簡單,最容易想到的做法

var factorialMap = make(map[int]int)  func Factorial(n int) {     result := 1     for i := 1; i <= n; i++ {         result *= i     }     factorialMap[n] = result }  func main() {     for i := 1; i < 100; i++ {         go Factorial(i)     }     time.Sleep(time.Second * 3)     for k, v := range factorialMap {         fmt.Printf("%d 的階乘是%dn", k, v)     } }
登錄后復制

一文聊聊Go語言中資源競爭問題當并發數比較小的時候,這個問題可能不會出現,一旦并發數變大,問題就立馬出現了

圖中的執行結果是并發map寫入錯誤為什么會出現這個問題,我們假設100個人往一個籃子里放水果,很容易。但是100個人從一個籃子里拿水果,那就會出問題,首先,籃子里的水果不一定夠100個,其二每個人都想先拿,必然會引起爭搶。

問題一優化

針對上面的問題,我們引入全局鎖的概念。這就有點像我們上廁所,100個人都想上廁所,但廁所只有1個,誰先搶到了誰先上,并且這個人還有給廁所上鎖,防止其他人進來

一文聊聊Go語言中資源競爭問題

var factorialMap = make(map[int]int) var lock sync.Mutex  func Factorial(n int) {     result := 1     for i := 1; i <= n; i++ {             result *= i     }     // defer 不好理解     // defer func(){     // 	lock.Unlock() // 執行完解鎖     // }()     lock.Lock() // 執行時上鎖     factorialMap[n] = result     lock.Unlock() // 執行后解鎖 }  func main() {     for i := 1; i < 100; i++ {         go Factorial(i)     }     time.Sleep(time.Second * 3)     for k, v := range factorialMap {         fmt.Printf("%d 的階乘是%dn", k, v)     } }
登錄后復制

一文聊聊Go語言中資源競爭問題執行結果有0可能是數據類型存不下了導致的,這個大家不用關心

一文聊聊Go語言中資源競爭問題這樣我們就解決了資源競爭的問題了。但其實還有一個問題,就是我們在主協程中還是必須手動等待,這要非常不好,那如果子協程3秒內解決不了怎么辦?

問題二優化

這個問題是我們不想在主協程中手動等待子協程,換句話說是我們不想直接在代碼中寫明要等待多長時間

這里我們就引入了WaitGroup

var factorialMap = make(map[int]int) var lock sync.Mutex var wg sync.WaitGroup  func Factorial(n int) {     result := 1     for i := 1; i <= n; i++ {         result *= i     }     lock.Lock() // 執行時上鎖     factorialMap[n] = result     lock.Unlock() // 執行后解鎖     wg.Done() }  func main() {     for i := 1; i < 100; i++ {         wg.Add(1)         go Factorial(i)     }     wg.Wait()     for k, v := range factorialMap {         fmt.Printf("%d 的階乘是%dn", k, v)     } }
登錄后復制

WaitGroup的內部原理大家自己細扣,我這就不講了 總結來說就是WaitGroup是一個籃子,每開一個協程,就往籃子中加一個標識(Add函數),每執行完一個協程,就從籃子中減去一個標識(Done函數),最后查看籃子中,如果是空的,就表示協程執行完了(Wait函數)

【推薦學習:go視頻教程】

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
国产综合18久久久久久| 免费A级毛片18禁网站APP| 一区二区三区在线 | 日| 欧美FREESEX黑人又粗又大| 丰满人妻被黑人连续中出| 亚洲AV无码专区亚洲AV| 男阳茎进女阳道啪啪| 高清一区二区三区免费视频| 亚洲国产精品久久久天堂麻豆宅男 | 乱码人妻一区二区三区| 得到超级肉禽系统的小说怎么办| 亚洲JIZZJIZZ中国少妇| 欧洲肉欲K8播放毛片| 好男人官网资源在线观看 | 男生把小j放进女人屁股视频狂躁| 国产2021在线传媒麻豆| 野花韩国视频免费高清3| 十八禁无码精品A∨在线观看| 久久精品人人做人人爽老司机 | 成人性生交大片免费看好| 亚洲熟妇无码AV| 天天摸夜夜添狠狠添高潮出水 | 永久免费观看美女裸体的网站 | 亚洲鲁丝片AV无码多人| 婷婷综合另类小说色区| 欧美日韩XXOO无码专区| 精品一线二线三线区别大吗| 国产办公室沙发系列高清| 99RIAV国产精品视频| 亚洲熟女AV综合网五月| 亚洲 都市 无码 校园 激情| 日本AⅤ精品一区二区三区久久| 久久久久夜夜夜精品国产| 国产又黄又硬又粗| 国产精品白丝久久AV网站| 成年美女黄网站色大免费视频 | 女少18XⅩXX性XXXXHD| 久久精品久久久久久噜噜| 国模无码一区二区三区| 国产精品VA尤物在线观看| 动漫成人无码精品一区二区三区| CHINESEVIDEO性大全| 真人作爱90分钟免费看视频| 亚洲日韩精品A∨片无码| 亚洲AV永久无码精品国产精品 | 波多野结衣 美乳人妻| japanese国产在线观看| AV色综合久久天堂AV色综合在| 中文字幕乱妇无码AV在线| 在线天堂中文最新版WWW| 一区二区三区无码AV不卡| 一本大道香蕉在线精品 | 年级老师的滋味4| 欧美日韩一区二区三区在线观看视| 欧美叉叉叉BBB网站| 欧美乱码卡1卡2卡三卡四卡| 人妻丰满熟妇av无码久久洗澡| 亲生乖女好紧H下| 日本亲近相奷中文字幕| 少洁白妇无删减全文阅读| 无码少妇一区二区三区| 亚洲AV无码乱码精品国产按摩| 亚洲AV最新在线观看网址下载| 亚洲VA无码VA在线VA天堂| 亚洲熟女WWW一区二区三区| 中文字幕人妻三级中文无码视频| AV中文无码乱人伦在线观看| 成人精品视频一区二区三区尤物| 国产A∨国片精品青草视频| 国产美女在线精品免费观看| 精产国品一二三产区M553| 毛片亚洲AV无码精品国产午夜| 欧美性巨大╳╳╳╳╳高跟鞋| 日韩毛片无码永久免费看| 小猪视频APP永久观看破解| 亚洲色婷婷六月亚洲婷婷6月| 18禁美女裸身无遮挡免费网站| А√天堂资源地址在线| 国产精品无码素人福利免费| 久久久久精品日韩久久久| 人妻AV中文系列| 色老板在线永久免费视频| 国产网红无码精品视频| 久久精品亚洲日本波多野结衣| 欧美最猛黑人XXXⅩ猛男野外 | YY111111少妇影院无码老| 国产美女被遭高潮免费网站| 免费AV永久免费网址| 三级在线看中文字幕完整版| 亚洲精品中文字幕久久久久下载| CHINA中国人CHINESE| JΑPΑNESEHD熟女熟妇伦| 人人妻人人澡人人爽欧美一区九九| 互换人妻ⅩXXBBBB| 久久久噜噜噜久久熟女| 日韩欧美亚洲综合久久影院D3| 亚洲欧洲无码一区二区三区| 不收费的十大免费好用的软件| 精品无人区一区二区三区| 肉体XXXXXⅠ8XXXX| 中文亚洲爆乳AV无码专区| 国产伦精品一区二区三区免费| 欧美成人片在线观看网站| 亚洲AV中文无码字幕色| 纯肉无遮挡H肉动漫在线观看国产| 久久精品免费一区二区三区| 丝瓜成视频人APP下载网站| 2022最新韩国理伦片在线观看| 国外免费B2B网站| 色综合99久久久无码国产精品| 在线看片无码永久AV| 极品少妇被猛得白浆直流草莓| 色偷偷偷久久伊人大杳蕉| CHINESE农村老妓女| 乱VODAFONEWIFI熟妇| 亚洲丁香婷婷久久一区二区| 国产成人亚洲综合网站| 日韩AV一区二区在线| 99国产欧美精品久久久蜜芽| 久久久久久人妻一区精品 | 国产AⅤ无码一区二区三区| 欧日韩无套内射变态| 777米奇色888狠狠俺去啦| 久久综合亚洲鲁鲁九月天| 亚洲区小说区图片区QVOD | 亚洲 欧美 激情 小说 另类| 国产精品久久自在自线| 偷拍精品视频一区二区三区| 乖宝真紧H嘶爽老子H| 天堂AV无码大芭蕉伊人AV不卡| 东京热加勒比无码少妇| 色在线 | 国产| 国产成人综合在线视频| 无套内谢孕妇毛片免费看看| 国产精品偷窥老熟女高潮| 五月香丁激情欧美啪啪| 国产又黄又大又粗的视频| 亚洲の无码国产の无码影院 | 少妇饥渴XXHD麻豆XXHD骆| 国产成人无码精品久久二区三区| 丝袜美腿一区二区三区| 国产精品国产免费无码专区蜜桃 | CHINESETUBE国产在线| 日本丰满少妇XXXX| 国产V精品成人免费视频| 亚洲AV无码AV制服丝袜在线| 久久97人人超人人超碰超国产| 又大又粗又爽A级毛片免费看| 欧美VA亚洲VA在线观看| 超碰97人人做人人爱可以下载 | BT天堂资源种子在线| 色天使色偷偷色噜噜噜| 国产又爽又黄又无遮挡的激情视频| 亚洲成人综合av| 尿眼PEEHOLE重口| 乖我们换个姿态再来一遍吧的小说| 无码人妻久久1区2区3区| 久久国产精品无码一区二区三区| 最新AV片免费网站入口| 试看20分钟做受| 久久久久99精品成人片三人毛片| 99精品视频九九精品视频| 偷偷色噜狠狠狠狠的777米奇| 狠狠色噜噜狠狠狠888米奇视频| 111111少妇影院| 无码免费中文字幕视频| 久久久久亚洲AV无码成人片麻豆 | 日韩夜夜高潮夜夜爽无码 | 影音先锋最新AV资源网站| 太大太长太粗太久太硬了| 久久久久99精品成人品| 粉嫩虎白女毛片人体| 野花高清完整版免费观看视频电视| 日韩精品一二三区| 久久精品国产亚洲AV忘忧草18| 大鷄巴久久久久久久久久| 一面膜上边一面膜下边视频| 无码动漫性爽XO视频在线观看不| 蜜桃视频一区二区三区| 国产乱色国产精品免费视频 | 国产精品VA在线播放| IPHONE14欧美日韩版本| 亚洲乱码日产精品BD在线观看 | YW亚洲AV无码乱码在线观看| 亚洲综合色在线观看一区二区 | 顶级欧美熟妇XXXXX欧美精品| 中国少妇内射XXXXX-百度| 亚洲成A人片在线观看无码不卡 | 国产午夜亚洲精品理论片不卡| 办公室的秘密2中文字幕| 中文有无人妻VS无码人妻激烈| 亚洲精品中文字幕无码蜜桃| 午夜理论片YY44880影院| 日韩精品无码一本二本三本色| 欧美成人少妇人妻精品视频| 久久久久久人妻一区二区三区| 黄桃AV无码免费一区二区三区| 国产品无码一区二区三区在线| 国产AV无码专区亚洲AV软件| 潮喷无码正在播放|