亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何動態決定處理任務的 goroutines 數量

如何動態決定處理任務的 goroutines 數量

Go
萬千封印 2023-06-05 18:23:24
我寫了一個虛擬代碼來演示目的。代碼中有 2 個通道和 3 個協程。1 goroutine 正在根據它們是否可以被 100 整除而沒有余數來生成數字:如果數字可以被 100 整除,則將其推送到第一個通道。否則它會將它推到第二個通道。2 個 goroutines 是這些通道的消費者:1 個 goroutine 負責處理數字 1...99 - 101...199 等。其他 goroutine 負責 100、200、300 等?,F在很明顯,一個協程比另一個協程多 99 倍的工作要做。這在 Go 中是如何處理的?如果一個 goroutine 比其他 goroutine 工作得更多,這個 goroutine 是否有更多的 CPU 時間?還是我應該處理這種情況,例如為資源消耗量更大的頻道創建 99 個 goroutine?(為了爭論,這些工作被認為是相同的)func main() {    ch1 := make(chan int)    ch2 := make(chan int)    go generator(ch1, ch2)    go handler(ch1)    go handler2(ch2)    time.Sleep(1*time.Second)}func generator(chan1, chan2 chan int){    for i:=0 ; ; i++{        if i%100 == 0{            chan1 <- i        }else{            chan2 <- i        }    }}func handler(number chan int){    for _ = range number{        num := <- number        fmt.Println("Number divided by 100 is 0. ", num)    }}func handler2(number chan int){    for _ = range number{        num := <- number        fmt.Println("Number divided by 100 is not 0. ", num)    }}
查看完整描述

2 回答

?
largeQ

TA貢獻2039條經驗 獲得超8個贊

goroutine 獲得多少 CPU 資源取決于很多因素。

我們一般可以說的是,僅處理可被 100 整除的數字的 goroutine 很可能比另一個 goroutine 等待更多。你不應該擔心這一點,等待通道上的元素不需要 CPU 資源,所以如果你有“足夠”的其他 goroutines 有工作要做,他們可以利用你的 CPU。

由于顯而易見的原因,您的示例很簡單,但在現實生活中,將您的任務抽象為一般任務(例如,處理任何數字都可能是一項任務)、創建和使用一般工作池并發送所有任務會更有利可圖執行到池中。這樣,無論池中有多少 goroutine,如果有工作要做并且有空閑(等待)goroutine,它將承擔任務,盡可能利用您的 CPU 資源。作業處理器(執行者)應該知道如何處理數字是100101。

查看完整回答
反對 回復 2023-06-05
?
冉冉說

TA貢獻1877條經驗 獲得超1個贊

如果沒有任何內容可供ch2閱讀,handler2則什么也不做。同時,handler1忙于處理它從中讀取的內容 ch1。這會消耗更多的 CPU 時間。

從啟動三個 Goroutine 到數據在通道上可用需要多長時間會很有趣。有可能generator之前已經完成了所有工作handler1handler2準備好從通道中讀取。在這種情況下,handler2將很快完成其工作,同時handler1還有工作要做。

您當然可以創建更多 Goroutines,它們handler1將以一種循環方式處理數據。根據工作的性質,這可能會提高或降低整體性能。

順便說一句,generator應該在一切都寫完的時候。closech1ch2


查看完整回答
反對 回復 2023-06-05
  • 2 回答
  • 0 關注
  • 158 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號