go語言解決併發的方法有哪些?

時間 2021-05-31 20:42:28

1樓:李廣勝

完全沒有必要用協程處理mysql請求。

從mysql拿資料,等待資料返回,處理資料這是乙個同步過程,這個地方用協程處理沒有任何意義,就算你用協程處理mysql,處理請求的協程還是要等待mysql的資料返回。

如果你擔心mysql鏈結在等待資料的時候會占用CPU時間,完全不會,go的排程器已經實現了netpoller,在等待io的時候會自動掛起來,不會占用CPU時間,也不會耽誤其他協程處理其他http請求。

如果你擔心mysql鏈結數不夠,多個mysql請求會阻塞,那你需要的是連線池技術,或者換帶連線池的orm

2樓:濤叔

你這個階段少做專案多讀書,把基礎夯實。別浪費了大好的光陰。

好好學習文獻索,谷歌一下 golang concurrency patterns 關鍵字,可以查到很多。

學好英語。

3樓:cx2333

專案初期不要糾結效能問題,有很多專案的都是用python來寫的,只求快速原型即可。把困難的問題先滯後(打個//todo)。

4樓:波羅學

簡單回答下!

如果你只是乙個 IO 操作,沒必要在處理函式(協程)再開子協程,沒什麼用。因為,無論你開不開協程,都需要等待這個 IO 完成。乙個 IO 操作,併發啟不到提高效能的作用。

如果要提高效能,除非有多個 IO 同時出現在乙個處理函式裡,並且它們之間沒有依賴關係。比如同時請求資料庫和 RPC 服務。

乙個簡單示例。

varwg

sync

.WaitGroupwg.

Add(2)

gofunc

()()

gofunc

()()

// 等待它們都完成wg.

Wait

()// 處理其他邏輯

// 返回資料

也可以把 WaitGroup 換成你的 channel,這裡不存在競爭,用 WaitGroup 更簡單點。

這裡說的單個函式的效能,每個 http 請求處理函式本來已經是乙個協程,如果不存在併發邏輯,請不要為併發而併發。

還有什麼辦法能提高服務效能?

Go 的併發模型,相對於傳統的程序、執行緒,已經能接收更多的併發請求,這工作是框架會實現的,不用我們考慮。但請求接收進來要能被快速處理,為提高併發性,還是要從處理函式入手。

那如何提高處理函式的效能呢?

一方面,像前面說的,多 IO 請求併發處理。但除此以外,還要把更多工作放在周邊服務上,比如資料庫優化、使用快取。如果有一些複雜邏輯,可以嘗試非同步化處理,比如使用一些訊息佇列非同步化,或者後台批處理。

這個話題就大了,不過,一般的場景也不是很難,畢竟不是每個人都有機會遇到大併發量。

提醒一點,提高效能不能只依靠語言解決,還需要學會靈活地根據實際場景尋找解決方案。

有哪些值得學習的 Go 語言開源專案?

nicholas 如果是新手的話,可以試試這個https wang6756 開源 golang123 是使用 vue nuxt nodejs 和 golang 開發的社群系統 Github shen100 golang123 求star,求支援,求註冊,求使用。 劉東 先讓開發自動化 https g...

Go語言有什麼好用的IDE嗎?

TsingsonQin 2019 08 02 補充 情況變化了,從 go 1.12 開始,go 支援 go module 後,只推薦 jetbrains Goland 這款IDE,支援 go module 與 go debug 都非常好.我現在寫 go 只用 Goland 開發.其他 go 的 ID...

go語言有什麼不可替代的嗎?

Shiwei Zhang Go沒有什麼不可替代。但是反過來,很多東西無法被Go替代,就比如說加密庫。自帶的加密庫不是FIPS合規的。不過有一是一,寫小程式的話,Go真香。誒?這不就成了個 指令碼語言 了麼。 如果是套皮,做API boy,那就沒有。但,Go是一門夾帶私貨的語言,加密庫是自家的,編譯器...