解決並行排程問題的幾個思路

2021-09-23 01:43:04 字數 1403 閱讀 9604

func

main()

}

func

main()

}

不行,回想剛才 sleep 和 study 的例子,程式會瞬間結束,go 出來的分身(goroutine)什麼都來不及做。對於這種場景,教給你三種方法進行併發完成任務。

第一種方法:

func

main()

()}// main 在這裡阻塞,等著他們做完

for i :=

0; i <

len(urls)

; i++

}

但是這有個問題,當任務量很大(urls 中元素很多)時,main 函式可能要召喚上千個分身,可能會過度並行,反而會極大降低效率。因為計算機的資源畢竟是有限的,比如 cpu 個數限制計算負載,硬碟決定你的 io 操作頻率,網路狀況決定網速上限等等。所以過度並行是需要避免的,最好限制 goroutine 的數量,不要讓 main 函式無限制地召喚分身。

第二種方法:

func

main()

()}// main 在這裡等著大家執行完

for i :=

0; i <

len(urls)

; i++

}

這裡新建了乙個帶 10 個緩衝容量的 channel。就是說往這個 channel 裡傳送訊息時,如果還有緩衝位,即便沒有人正在另一頭接收訊息,也可以傳送,暫存在緩衝中,除非緩衝也被佔滿,才會發生阻塞;接收同理,如果快取非空,可以從快取裡取訊息,如果快取也是空的,才會發生阻塞。類似排隊。

可以想象這個場景:工地裡有很多任務要做,但是只有 10 個櫃子可以存放個人物品,每個分身去幹活前都得存放物品,幹完活後再把自己的東西取走。只有存在空櫃子的時候,才能有新的分身進入幹活。這就保證了同時最多有 10 個分身在工作。

方法三:

func

main()

}()}

// 再派遣乙個分身專門發任務,等著人接收

gofunc()

}()// main 在這等著大家把活幹完

for i :=

0; i <

len(urls)

; i++

}

這裡用到了 range 關鍵字,相當於不斷地企圖從 channel 裡搶任務,搶到了就去做,做完了回來繼續搶;如果沒有搶到任務就阻塞在那等著下一波機會。

這個方法通過建立 10 個長活的 goroutine,實現了對併發的限制,即同時最多有 10 個分身在幹活。

解決問題的思路

乙個if else 體現出的解決問題的能力,思路,這就是錢 string tostation string jobj data i agv target place code string mocode string jobj data i mo code 工單 task.receive date ...

解決問題的思路

中國人喜歡從大處著眼,西方人喜歡從小處入手 不知道這句話對不對 似乎從大處著眼更適合社會學方面,而小處入手更適合自然科學。中國現代的教育制度學習西方,是不是這個問題把語文教學搞得面目可憎?讓學生整體像是要拿解剖刀一樣分析文章 字 詞 句,段?而忽略了社會學的美?但是從另一方面來說,既然考核的思路是如...

解決問題的思路beta

size large 1.首先是條件的提取 2.然後是尋找解決方案 3.做完了一定要驗證 4.擴充套件 a.列出所有你解決方案中用到的條件 b.問自己一些問題,仔細思考你現行的解決方案中有沒有做重複或多餘或疑似複雜了的步驟 c.如果有重複步驟,嘗試在原有條件不變的前提下,優化解決方 size 最近,...