欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

Go語言中怎么對(duì)Concurrency進(jìn)行管理

這篇文章給大家介紹 Go語言中怎么對(duì)Concurrency進(jìn)行管理 ,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

創(chuàng)新互聯(lián)2013年開創(chuàng)至今,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元大寧做網(wǎng)站,已為上家服務(wù),為大寧各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

WaitGroup

先來了解有什么情境需要使用到  WaitGroup,假設(shè)您有兩臺(tái)機(jī)器需要同時(shí)上傳最新的代碼,兩臺(tái)機(jī)器分別上傳完成后,才能執(zhí)行最后的重啟步驟。就像是把一個(gè)工作同時(shí)拆成好幾份同時(shí)一起做,可以減少時(shí)間,但是最后需要等到全部做完,才能執(zhí)行下一步,這時(shí)候就需要用到  WaitGroup 才能做到。

package main  import (     "fmt"     "sync" )  func main() {     var wg sync.WaitGroup     i := 0     wg.Add(3) //task count wait to do     go func() {         defer wg.Done() // finish task1         fmt.Println("goroutine 1 done")         i++     }()     go func() {         defer wg.Done() // finish task2         fmt.Println("goroutine 2 done")         i++     }()     go func() {         defer wg.Done() // finish task3         fmt.Println("goroutine 3 done")         i++     }()     wg.Wait() // wait for tasks to be done     fmt.Println("all goroutine done")     fmt.Println(i) }

Channel

另外一種實(shí)際的案例就是,我們需要主動(dòng)通知一個(gè) Goroutine 進(jìn)行停止的動(dòng)作。換句話說,當(dāng) App 啟動(dòng)時(shí),會(huì)在后臺(tái)跑一些監(jiān)控程序,而當(dāng)整個(gè) App  需要停止前,需要發(fā)個(gè) Notification 給后臺(tái)的監(jiān)控程序,將其先停止,這時(shí)候就需要用到 Channel 來通知??聪孪旅孢@個(gè)例子:

package main  import (     "fmt"     "time" )  func main() {     exit := make(chan bool)     go func() {         for {             select {             case <-exit:                 fmt.Println("Exit")                 return             case <-time.After(2 * time.Second):                 fmt.Println("Monitoring")             }         }     }()     time.Sleep(5 * time.Second)     fmt.Println("Notify Exit")     exit <- true //keep main goroutine alive     time.Sleep(5 * time.Second) }

上面的例子可以發(fā)現(xiàn),用了一個(gè) Gogourtine 和 Channel 來控制。可以想像當(dāng)后臺(tái)有無數(shù)個(gè) Goroutine 的時(shí)候,我們就需要用多個(gè)  Channel 才能進(jìn)行控制,也許 Goroutine 內(nèi)又會(huì)產(chǎn)生 Goroutine,開發(fā)者這時(shí)候就會(huì)發(fā)現(xiàn)已經(jīng)無法單純使用 Channel 來控制多個(gè)  Goroutine 了。這時(shí)候解決方式會(huì)是傳遞 Context。

Context

大家可以想像,今天有一個(gè)后臺(tái)任務(wù) A,A 任務(wù)又產(chǎn)生了 B 任務(wù),B 任務(wù)又產(chǎn)生了 C 任務(wù),也就是可以按照此模式一直產(chǎn)生下去,假設(shè)中途我們需要停止 A  任務(wù),而 A 又必須告訴 B 及 C 要一起停止,這時(shí)候通過 context 方式是最快的了。

package main  import (     "context"     "fmt"     "time" )  func foo(ctx context.Context, name string) {     go bar(ctx, name) // A calls B     for {         select {         case <-ctx.Done():             fmt.Println(name, "A Exit")             return         case <-time.After(1 * time.Second):             fmt.Println(name, "A do something")         }     } }  func bar(ctx context.Context, name string) {     for {         select {         case <-ctx.Done():             fmt.Println(name, "B Exit")             return         case <-time.After(2 * time.Second):             fmt.Println(name, "B do something")         }     } }  func main() {     ctx, cancel := context.WithCancel(context.Background())     go foo(ctx, "FooBar")     fmt.Println("client release connection, need to notify A, B exit")     time.Sleep(5 * time.Second)     cancel() //mock client exit, and pass the signal, ctx.Done() gets the signal  time.Sleep(3 * time.Second)     time.Sleep(3 * time.Second) }  package main  import (     "context"     "fmt"     "time" )  func foo(ctx context.Context, name string) {     go bar(ctx, name) // A calls B     for {         select {         case <-ctx.Done():             fmt.Println(name, "A Exit")             return         case <-time.After(1 * time.Second):             fmt.Println(name, "A do something")         }     } }  func bar(ctx context.Context, name string) {     for {         select {         case <-ctx.Done():             fmt.Println(name, "B Exit")             return         case <-time.After(2 * time.Second):             fmt.Println(name, "B do something")         }     } }  func main() {     ctx, cancel := context.WithCancel(context.Background())     go foo(ctx, "FooBar")     fmt.Println("client release connection, need to notify A, B exit")     time.Sleep(5 * time.Second)     cancel() //mock client exit, and pass the signal, ctx.Done() gets the signal  time.Sleep(3 * time.Second)     time.Sleep(3 * time.Second) }

大家可以把 context 想成是一個(gè) controller,可以隨時(shí)控制不確定個(gè)數(shù)的  Goroutine,由上往下,只要宣告context.WithCancel后,再任意時(shí)間點(diǎn)都可以通過cancel()來停止整個(gè)后臺(tái)服務(wù)。實(shí)際案例會(huì)用在當(dāng) App  需要重新啟動(dòng)時(shí),要先通知全部 goroutine 停止,正常停止后,才會(huì)重新啟動(dòng) App。

總結(jié)

根據(jù)不同的情境跟狀況來選擇不同的方式,做一個(gè)總結(jié):

  • WaitGroup:需要將單一個(gè)工作分解成多個(gè)子任務(wù),等到全部完成后,才能進(jìn)行下一步,這時(shí)候用 WaitGroup 最適合了

  • Channel + Select:Channel 只能用在比較單純的 Goroutine 情況下,如果要管理多個(gè) Goroutine,建議還是 走  context 會(huì)比較適合

  • Context:如果您想一次控制全部的 Goroutine,相信用 context 會(huì)是最適合不過的。

關(guān)于 Go語言中怎么對(duì)Concurrency進(jìn)行管理 就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

文章標(biāo)題:Go語言中怎么對(duì)Concurrency進(jìn)行管理
瀏覽路徑:http://chinadenli.net/article4/ppcgoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作網(wǎng)站策劃、網(wǎng)站排名手機(jī)網(wǎng)站建設(shè)、ChatGPT軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
欧美日韩综合免费视频| 国产高清一区二区不卡| 日韩精品日韩激情日韩综合| 亚洲欧美精品伊人久久| 国产成人av在线免播放观看av | 国产一区欧美一区日韩一区| 久久精品福利在线观看| 91亚洲国产日韩在线| 国产丝袜女优一区二区三区| 久久国产亚洲精品赲碰热| 中字幕一区二区三区久久蜜桃 | 国产又粗又爽又猛又黄的| 中文字幕一区二区三区大片| 精品一区二区三区免费看| 我想看亚洲一级黄色录像| 成人免费在线视频大香蕉| 国产激情一区二区三区不卡| 亚洲欧美日韩国产综合在线| 欧美有码黄片免费在线视频| 精品女同一区二区三区| 国产日韩欧美国产欧美日韩 | 丰满熟女少妇一区二区三区| 国产a天堂一区二区专区| 婷婷色网视频在线播放| 色小姐干香蕉在线综合网| 国产色第一区不卡高清| 男生和女生哪个更好色| 极品熟女一区二区三区| 亚洲视频一区二区久久久| 国产免费操美女逼视频| 亚洲中文字幕有码在线观看| 东北老熟妇全程露脸被内射| 亚洲女同一区二区另类| 国产黑人一区二区三区| 观看日韩精品在线视频| 91免费一区二区三区| 中字幕一区二区三区久久蜜桃| 日本欧美一区二区三区高清| 欧美一区日韩二区亚洲三区| 婷婷基地五月激情五月| 欧美日韩精品人妻二区三区|