福哥答案2020-08-20:
創(chuàng)新互聯(lián)公司長期為上1000+客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為劍川企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計、網(wǎng)站制作,劍川網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
1.golang的協(xié)程是基于gpm機制,是可以多核多線程的。Python的協(xié)程是eventloop模型(IO多路復(fù)用技術(shù))實現(xiàn),協(xié)程是嚴格的 1:N 關(guān)系,也就是一個線程對應(yīng)了多個協(xié)程。雖然可以實現(xiàn)異步I/O,但是不能有效利用多核(GIL)。
2.golang用go func。python用import asyncio,async/await表達式。
評論
線程:
多線程是為了解決CPU利用率的問題,線程則是為了減少上下文切換時的開銷,進程和線程在Linux中沒有本質(zhì)區(qū)別,最大的不同就是進程有自己獨立的內(nèi)存空間,而線程是共享內(nèi)存空間。
在進程切換時需要轉(zhuǎn)換內(nèi)存地址空間,而線程切換沒有這個動作,所以線程切換比進程切換代價要小得多。
協(xié)程:
想要簡單,又要性能高,協(xié)程就可以達到我們的目的,它是用戶視角的一種抽象,操作系統(tǒng)并沒有這個概念,主要思想是在用戶態(tài)實現(xiàn)調(diào)度算法,用少量線程完成大量任務(wù)的調(diào)度。
Goroutine是GO語言實現(xiàn)的協(xié)程,其特點是在語言層面就支持,使用起來十分方便,它的核心是MPG調(diào)度模型:M即內(nèi)核線程;P即處理器,用來執(zhí)行Goroutine,它維護了本地可運行隊列;G即Goroutine,代碼和數(shù)據(jù)結(jié)構(gòu);S及調(diào)度器,維護M和P的信息。
基本設(shè)計思路:
類型轉(zhuǎn)換、類型斷言、動態(tài)派發(fā)。iface,eface。
反射對象具有的方法:
編譯優(yōu)化:
內(nèi)部實現(xiàn):
實現(xiàn) Context 接口有以下幾個類型(空實現(xiàn)就忽略了):
互斥鎖的控制邏輯:
設(shè)計思路:
(以上為寫被讀阻塞,下面是讀被寫阻塞)
總結(jié),讀寫鎖的設(shè)計還是非常巧妙的:
設(shè)計思路:
WaitGroup 有三個暴露的函數(shù):
部件:
設(shè)計思路:
結(jié)構(gòu):
Once 只暴露了一個方法:
實現(xiàn):
三個關(guān)鍵點:
細節(jié):
讓多協(xié)程任務(wù)的開始執(zhí)行時間可控(按順序或歸一)。(Context 是控制結(jié)束時間)
設(shè)計思路: 通過一個鎖和內(nèi)置的 notifyList 隊列實現(xiàn),Wait() 會生成票據(jù),并將等待協(xié)程信息加入鏈表中,等待控制協(xié)程中發(fā)送信號通知一個(Signal())或所有(Boardcast())等待者(內(nèi)部實現(xiàn)是通過票據(jù)通知的)來控制協(xié)程解除阻塞。
暴露四個函數(shù):
實現(xiàn)細節(jié):
部件:
包: golang.org/x/sync/errgroup
作用:開啟 func() error 函數(shù)簽名的協(xié)程,在同 Group 下協(xié)程并發(fā)執(zhí)行過程并收集首次 err 錯誤。通過 Context 的傳入,還可以控制在首次 err 出現(xiàn)時就終止組內(nèi)各協(xié)程。
設(shè)計思路:
結(jié)構(gòu):
暴露的方法:
實現(xiàn)細節(jié):
注意問題:
包: "golang.org/x/sync/semaphore"
作用:排隊借資源(如錢,有借有還)的一種場景。此包相當于對底層信號量的一種暴露。
設(shè)計思路:有一定數(shù)量的資源 Weight,每一個 waiter 攜帶一個 channel 和要借的數(shù)量 n。通過隊列排隊執(zhí)行借貸。
結(jié)構(gòu):
暴露方法:
細節(jié):
部件:
細節(jié):
包: "golang.org/x/sync/singleflight"
作用:防擊穿。瞬時的相同請求只調(diào)用一次,response 被所有相同請求共享。
設(shè)計思路:按請求的 key 分組(一個 *call 是一個組,用 map 映射存儲組),每個組只進行一次訪問,組內(nèi)每個協(xié)程會獲得對應(yīng)結(jié)果的一個拷貝。
結(jié)構(gòu):
邏輯:
細節(jié):
部件:
如有錯誤,請批評指正。
網(wǎng)站標題:go語言協(xié)程實現(xiàn) go協(xié)程如何實現(xiàn)
轉(zhuǎn)載注明:http://m.rwnh.cn/article38/hichpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、定制開發(fā)、外貿(mào)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作、ChatGPT、營銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)