.net httpwebrequest 并发慢_go语言并发之MPG模型
不要以共享內存的方式來通信,相反,要通過通信來共享內存。
go語言天生的并發大家都知道,可是go是如何實現輕松的構造上萬的協程呢?今天我們就說一下go并發的MPG模型。
后續會有更多的模式和算法以及區塊鏈相關的,如果你是想學習go語言或者是對設計模式或者算法感興趣亦或是區塊鏈開發工作者,都可以關注一下。(微信公眾號:Go語言之美,更多go語言知識信息等)。公眾號會持續為大家分享更多干貨。多個goroutine并發合作
上面這個圖生動的說明多個協程工作形式,其中每一個gopher(土撥鼠)可以看作一個協程(G),其實對于這些gopher,還有一個包工頭的gopher,他來管理這些工作的gopher,這個包工頭就可以看作一個 Seched。
MPG
我們在看上面這個圖,圖中P正在執行的Goroutine為藍色的,處于待執行狀態的Goroutine為灰色的,灰色的Goroutine形成了一個隊列runqueues。
我們再看一下三者的宏觀圖:
MPG宏觀圖
在這里,當一個P關聯多個G時,就會處理G的執行順序,就是并發,當一個P在執行一個協程工作時,其他的會在等待,當正在執行的協程遇到阻塞情況,例如IO操作等,go的處理器就會去執行其他的協程,因為對于類似IO的操作,處理器不知道你需要多久才能執行結束,所以他不回去等你執行完。
上面我們看著go的并發好像是搶占式的,事實上go的協程是非搶占式的,由協程主動交出控制權,也就是說,上面在發生IO操作時,并不是調度器強制切換執行其他的協程,而是當前協程交出了控制權,調度器才去執行其他協程。我們列舉一下goroutine可能切換的點:
- I/O,select
- channel
- 等待鎖
- runtime.Gosched()
這些點是go協程可能切換的地方,但是并不是一定切換的。
正是因為是非搶占式的,所以才輕松的構造上萬的協程,如果是搶占式,那么就會在切換任務時,保存當前的上下文環境,因為當前線程如果正在做一件事,做到一半,我們就強制停止,這時我們就必須多保存很多信息,避免再次切換回來時任務出錯。
線程是操作系統層面的多任務,而go的協程屬于編譯器層面的多任務,go有自己的調度器來調度。一個協程在哪個線程上是不確定的,這個是由調度器來決定的,多個協程可能在一個或多個線程上運行。
go的并發是很重要的,這里只是簡單說一下MPG模型的個人理解,如果大家有不同意見,可以一起討論學習,三人行必有我師。如果覺得這篇文章不錯可以轉發(微信公眾號/今日頭條:Go語言之美,更多go語言知識信息等)。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的.net httpwebrequest 并发慢_go语言并发之MPG模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iphone以旧换新活动_iPhone第
- 下一篇: vue标准时间改为时间戳_正确的济南初中