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