日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

go 怎么等待所有的协程完成_Go 编程:如何实现协程调度的精准控制

發(fā)布時(shí)間:2024/4/19 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go 怎么等待所有的协程完成_Go 编程:如何实现协程调度的精准控制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

說(shuō)起 Go 協(xié)程的調(diào)度,如果你了解 Go 調(diào)度器以及其實(shí)現(xiàn)的 G/P/M 模型,當(dāng)然有助于應(yīng)用的開(kāi)發(fā)。但是在應(yīng)用層面上,這些底層的調(diào)度原理并不會(huì)幫你太多,實(shí)現(xiàn) Go 協(xié)程的精準(zhǔn)調(diào)度得完全靠自己。

問(wèn)題

例如,實(shí)際應(yīng)用中我們要解決的問(wèn)題是這樣的。那么,我們?cè)撊绾螌?shí)現(xiàn)調(diào)度的精準(zhǔn)控制呢?

實(shí)現(xiàn)

簡(jiǎn)單的協(xié)程控制,很多人都會(huì)使用 sync.WaitGroup 進(jìn)行多協(xié)程的控制。但是 sync.WaitGroup 面對(duì)圖示的調(diào)度控制就顯得無(wú)能為力了。

上圖的協(xié)程調(diào)度看似復(fù)雜,如果仔細(xì)分析一下,就會(huì)發(fā)現(xiàn)單個(gè)協(xié)程的啟動(dòng)需要等待依賴協(xié)程完成才能開(kāi)始。所以,問(wèn)題的關(guān)鍵是實(shí)現(xiàn)協(xié)程間的前置依賴。

那么,這樣一個(gè)前置依賴該如何實(shí)現(xiàn)呢?這里直接貼出我的方案,你也可以想想你要如何實(shí)現(xiàn)。

package?eventimport?(?"sync"?"sync/atomic")type?Event?struct?{?fired?int32?c?????chan?struct{}?once??sync.Once}func?New()?*Event?{?return?&Event{c:?make(chan?struct{})}}func?(ev?*Event)?Fire()?int32?{?atomic.AddInt32(&ev.fired,?1)?ev.once.Do(func()?{??close(ev.c)?})?return?ev.fired}func?(ev?*Event)?Done()??0}

這樣一個(gè)簡(jiǎn)單的事件觸發(fā)器就可以來(lái)模擬協(xié)程前置依賴。例如,圖示中的B1的啟動(dòng)依賴于A1與C1,那么我們的實(shí)現(xiàn)代碼就可以這樣實(shí)現(xiàn):

package?mainimport?(????"github.com/x-mod/event"?//Event?開(kāi)源項(xiàng)目在這里)func?main(){????//前置依賴????a1?:=?event.New()????b1?:=?event.New()????c1?:=?event.New()????//A1?協(xié)程????go?func(){????????defer?a1.Fire()????????//?A1?LOGIC?...????}????//B1?協(xié)程????go?func(){????????defer?b1.Fire()????????????????//?等待前置依賴完成????????

項(xiàng)目地址:https://github.com/x-mod/event

與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的go 怎么等待所有的协程完成_Go 编程:如何实现协程调度的精准控制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。