設(shè)置可同時(shí)執(zhí)行的邏輯Cpu數(shù)量,默認(rèn)和硬件的線程數(shù)一致而不是核心數(shù),可以通過(guò)調(diào)用GOMAXPROCS(-1)來(lái)獲取當(dāng)前邏輯Cpu數(shù)最好在main函數(shù)之前設(shè)置它,GOMAXPROCS同時(shí)也是go的環(huán)境變量之一。
站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到錦州網(wǎng)站設(shè)計(jì)與錦州網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋錦州地區(qū)。
return結(jié)束當(dāng)前函數(shù),并返回指定值;runtime.Goexit結(jié)束當(dāng)前goroutine,其他的goroutine不受影響,主程序也一樣繼續(xù)運(yùn)行;os.Exit會(huì)結(jié)束當(dāng)前程序,不管你三七二十一;暫停當(dāng)前goroutine,使其他goroutine先行運(yùn)算。只是暫停,不是掛起,當(dāng)時(shí)間片輪轉(zhuǎn)到該協(xié)程時(shí),Gosched()后面的操作將自動(dòng)恢復(fù)。還沒(méi)等到子協(xié)程執(zhí)行,主協(xié)程就已經(jīng)執(zhí)行完退出了,子協(xié)程將不再執(zhí)行,所以打印的全部是主協(xié)程的數(shù)據(jù)。當(dāng)然,實(shí)際上這個(gè)執(zhí)行結(jié)果也是不確定的,只是大概率出現(xiàn)以上輸出,因?yàn)橹鲄f(xié)程和子協(xié)程間并沒(méi)有絕對(duì)的順序關(guān)系。在打印goroutine1之前,主協(xié)程調(diào)用了runtime.Gosched()方法,暫停了主協(xié)程。子協(xié)程獲得了調(diào)度,從而先行打印了goroutine2。主協(xié)程不是一定要等其他協(xié)程執(zhí)行完才會(huì)繼續(xù)執(zhí)行,而是一定時(shí)間。如果這個(gè)時(shí)間內(nèi)其他協(xié)程沒(méi)有執(zhí)行完,那么主協(xié)程將繼續(xù)執(zhí)行,立即終止當(dāng)前協(xié)程,不會(huì)影響其它協(xié)程,且終止前會(huì)調(diào)用此協(xié)程聲明的defer方法。由于Goexit不是panic,所以recover捕獲的error會(huì)為nil。當(dāng)main方法所在主協(xié)程調(diào)用Goexit時(shí),Goexit不會(huì)return,所以主協(xié)程將繼續(xù)等待子協(xié)程執(zhí)行,當(dāng)所有子協(xié)程執(zhí)行完時(shí),程序報(bào)錯(cuò)deadlock。
內(nèi)核線程(Kernel-Level Thread ,KLT)
輕量級(jí)進(jìn)程(Light Weight Process,LWP):輕量級(jí)進(jìn)程就是我們通常意義上所講的線程,由于每個(gè)輕量級(jí)進(jìn)程都由一個(gè)內(nèi)核線程支持,因此只有先支持內(nèi)核線程,才能有輕量級(jí)進(jìn)程
用戶線程與系統(tǒng)線程一一對(duì)應(yīng),用戶線程執(zhí)行如lo操作的系統(tǒng)調(diào)用時(shí),來(lái)回切換操作開銷相對(duì)比較大
多個(gè)用戶線程對(duì)應(yīng)一個(gè)內(nèi)核線程,當(dāng)內(nèi)核線程對(duì)應(yīng)的一個(gè)用戶線程被阻塞掛起時(shí)候,其他用戶線程也阻塞不能執(zhí)行了。
多對(duì)多模型是可以充分利用多核CPU提升運(yùn)行效能的
go線程模型包含三個(gè)概念:內(nèi)核線程(M),goroutine(G),G的上下文環(huán)境(P);
GMP模型是goalng特有的。
P與M一般是一一對(duì)應(yīng)的。P(上下文)管理著一組G(goroutine)掛載在M(內(nèi)核線程)上運(yùn)行,圖中左邊藍(lán)色為正在執(zhí)行狀態(tài)的goroutine,右邊為待執(zhí)行狀態(tài)的goroutiine隊(duì)列。P的數(shù)量由環(huán)境變量GOMAXPROCS的值或程序運(yùn)行runtime.GOMAXPROCS()進(jìn)行設(shè)置。
當(dāng)一個(gè)os線程在執(zhí)行M1一個(gè)G1發(fā)生阻塞時(shí),調(diào)度器讓M1拋棄P,等待G1返回,然后另起一個(gè)M2接收P來(lái)執(zhí)行剩下的goroutine隊(duì)列(G2、G3...),這是golang調(diào)度器厲害的地方,可以保證有足夠的線程來(lái)運(yùn)行剩下所有的goroutine。
當(dāng)G1結(jié)束后,M1會(huì)重新拿回P來(lái)完成,如果拿不到就丟到全局runqueue中,然后自己放到線程池或轉(zhuǎn)入休眠狀態(tài)。空閑的上下文P會(huì)周期性的檢查全局runqueue上的goroutine,并且執(zhí)行它。
另一種情況就是當(dāng)有些P1太閑而其他P2很忙碌的時(shí)候,會(huì)從其他上下文P2拿一些G來(lái)執(zhí)行。
詳細(xì)可以翻看下方第一個(gè)參考鏈接,寫得真好。
最后用大佬的總結(jié)來(lái)做最后的收尾————
Go語(yǔ)言運(yùn)行時(shí),通過(guò)核心元素G,M,P 和 自己的調(diào)度器,實(shí)現(xiàn)了自己的并發(fā)線程模型。調(diào)度器通過(guò)對(duì)G,M,P的調(diào)度實(shí)現(xiàn)了兩級(jí)線程模型中操作系統(tǒng)內(nèi)核之外的調(diào)度任務(wù)。整個(gè)調(diào)度過(guò)程中會(huì)在多種時(shí)機(jī)去觸發(fā)最核心的步驟 “一整輪調(diào)度”,而一整輪調(diào)度中最關(guān)鍵的部分在“全力查找可運(yùn)行G”,它保證了M的高效運(yùn)行(換句話說(shuō)就是充分使用了計(jì)算機(jī)的物理資源),一整輪調(diào)度中還會(huì)涉及到M的啟用停止。最后別忘了,還有一個(gè)與Go程序生命周期相同的系統(tǒng)監(jiān)測(cè)任務(wù)來(lái)進(jìn)行一些輔助性的工作。
淺析Golang的線程模型與調(diào)度器
Golang CSP并發(fā)模型
Golang線程模型
//沒(méi)問(wèn)題的,可以make,應(yīng)該是你的主線程執(zhí)行完直接退出了,導(dǎo)致協(xié)程沒(méi)機(jī)會(huì)執(zhí)行,所以
//你看不到輸出而已。
func?main()?{
pix?:=?make([]uint8,?26707968)
fmt.Println("main?len:",len(pix))
go?func()?{
pix?:=?make([]uint8,?3300500)
fmt.Println("go?len:",len(pix))
}()
time.Sleep(time.Second)
}
網(wǎng)頁(yè)標(biāo)題:go語(yǔ)言線程終止,go 線程安全
文章鏈接:http://chinadenli.net/article42/dsicdec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、云服務(wù)器、網(wǎng)站收錄、網(wǎng)站營(yíng)銷、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)