![61396-Go語言程序設計項目化教程(微課版)5.2 并發(fā)_第1頁](http://file4.renrendoc.com/view10/M02/36/22/wKhkGWXdxXKAMSkzAAEEVorm4yU316.jpg)
![61396-Go語言程序設計項目化教程(微課版)5.2 并發(fā)_第2頁](http://file4.renrendoc.com/view10/M02/36/22/wKhkGWXdxXKAMSkzAAEEVorm4yU3162.jpg)
![61396-Go語言程序設計項目化教程(微課版)5.2 并發(fā)_第3頁](http://file4.renrendoc.com/view10/M02/36/22/wKhkGWXdxXKAMSkzAAEEVorm4yU3163.jpg)
![61396-Go語言程序設計項目化教程(微課版)5.2 并發(fā)_第4頁](http://file4.renrendoc.com/view10/M02/36/22/wKhkGWXdxXKAMSkzAAEEVorm4yU3164.jpg)
![61396-Go語言程序設計項目化教程(微課版)5.2 并發(fā)_第5頁](http://file4.renrendoc.com/view10/M02/36/22/wKhkGWXdxXKAMSkzAAEEVorm4yU3165.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
并發(fā)并發(fā)簡述goroutine調(diào)度select多路復用01.02.04.目錄channel通信機制03.sync并發(fā)控制05.01并發(fā)簡述進程,線程與協(xié)程并發(fā)與并行并發(fā)模型1并發(fā)簡述線程進程協(xié)程進程是系統(tǒng)進行資源分配和調(diào)度的最小單位,由內(nèi)核進行調(diào)度,擁有獨立的內(nèi)存單元。一個進程中的多個線程之間可以并發(fā)執(zhí)行。線程是CPU調(diào)度的最小單位,比進程更小的能獨立運行的基本單位,線程分為內(nèi)核態(tài)線程和用戶態(tài)線程,一個線程上可以運行多個協(xié)程。協(xié)程是輕量級的線程,獨立的??臻g,共享堆空間,調(diào)度由用戶自己控制。協(xié)程無法強制的切換CPU控制權,通常只能進行協(xié)作式調(diào)度。1并發(fā)簡述ABC并發(fā)是多線程程序在單核心的cpu上運行,一個時間段內(nèi)存在多個線程或進程執(zhí)行,但任何時間點上都只有一個線程或進程執(zhí)行,多個線程或進程爭搶時間片輪流執(zhí)行,單核處理器只能并發(fā)。并發(fā)1并發(fā)簡述ABC并行是多線程程序在多核心的cpu上運行,一個時間段和時間點存在多個線程或進程執(zhí)行,利用多核實現(xiàn)多線程的運行,并行需要多核處理器。并行1并發(fā)簡述并發(fā)模型多進程編程多進程是在操作系統(tǒng)層面進行并發(fā)的基本模式,所有的進程由內(nèi)核管理,相互之間不會影響,但系統(tǒng)開銷較大。多協(xié)程編程用戶態(tài)線程,不需要操作系統(tǒng)來進行搶占式調(diào)度,且在真正的實現(xiàn)中寄存于線程中,系統(tǒng)開銷極小。多線程編程大部分操作系統(tǒng)上都屬于系統(tǒng)層面的并發(fā)模式,比多進程的開銷小很多,但是其開銷依舊比較大,且在高并發(fā)模式下,效率會有影響。非阻塞/異步IO編程比多線程要復雜,通過事件驅(qū)動的方式使用異步IO,盡可能地少用線程,降低開銷。02goroutine調(diào)度goroutine定義普通函數(shù)創(chuàng)建goroutine匿名函數(shù)創(chuàng)建goroutine任何函數(shù)加上go就能發(fā)送調(diào)度器運行;不需要定義時區(qū)分是否異步函數(shù);調(diào)度器在合適的點進行切換;使用-race檢測數(shù)據(jù)訪問沖突;2goroutine調(diào)度調(diào)度器goroutinegoroutine線程goroutinegoroutine線程goroutine2goroutine調(diào)度示例:go函數(shù)名(參數(shù)列表)函數(shù)名:調(diào)用的函數(shù)名;參數(shù)列表:調(diào)用函數(shù)需要傳入的參數(shù);running
()goroutine終止main函數(shù)goroutinerunning函數(shù)goroutinemain()程序入口go普通函數(shù)()main函數(shù)終止普通函數(shù)創(chuàng)建goroutinefuncrunning(){//執(zhí)行語法}funcmain(){//并發(fā)執(zhí)行程序
gorunning()}2goroutine調(diào)度running
()goroutine終止main函數(shù)goroutine匿名函數(shù)goroutinemain()程序入口go匿名函數(shù)()main函數(shù)終止參數(shù)列表:函數(shù)體內(nèi)的參數(shù)變量列表。函數(shù)體:匿名函數(shù)的代碼。調(diào)用參數(shù)列表:啟動goroutine時,需要向匿名函數(shù)傳遞的調(diào)用參數(shù)。匿名函數(shù)創(chuàng)建goroutinefuncmain(){ gofunc(參數(shù)列表){
函數(shù)體 }(調(diào)用參數(shù)列表)}2goroutine調(diào)度funcrunning(namestring){vartimesintfor{times++fmt.Println(name,times)time.Sleep(time.Second)}}funcmain(){varnamestringname="并發(fā)"gorunning(name)}運行結果為:并發(fā)1并發(fā)2………..main函數(shù)中通過go關鍵字創(chuàng)建running函數(shù)goroutine并發(fā)運行;running函數(shù)中通過for實現(xiàn)無限循環(huán),time.Sleep暫停1秒后繼續(xù)循環(huán),主函數(shù)退出時并發(fā)程序終止;2goroutine調(diào)度funcmain(){gofunc(){vartimesintfor{times++fmt.Println("并發(fā)",times)time.Sleep(time.Second)}}()}運行結果為:并發(fā)1并發(fā)2……..main函數(shù)中通過go關鍵字創(chuàng)建匿名函數(shù)goroutine并發(fā)運行;匿名函數(shù)中通過for實現(xiàn)無限循環(huán),time.Sleep暫停1秒后繼續(xù)循環(huán),主函數(shù)退出時并發(fā)程序終止;03channel通信機制通道的特性通道的聲明通道數(shù)據(jù)接收與發(fā)送無緩沖通道有緩沖通道通道超時機制3channel通信機制Go語言中的通道(channel)是一種特殊的類型。在任何時候,同時只能有一個goroutine訪問通道進行發(fā)送和獲取數(shù)據(jù)。goroutine間通過通道就可以通信。通道像一個傳送帶或者隊列,總是遵循先入先出(FirstInFirstOut)的規(guī)則,保證收發(fā)數(shù)據(jù)的順序。通道(channel)var通道變量通道類型注:chan類型的空值是nil,聲明后需要配合make后才能使用1、聲明通道類型3channel通信機制通道實例:=make(數(shù)據(jù)類型)2、創(chuàng)建通道var通道實例<-chan數(shù)據(jù)類型3、聲明讀取單向通道var通道實例chan<-數(shù)據(jù)類型4、聲明寫入單向通道readch:=make(chanint)writech:=make(chanint)readch:=make(chanint)var讀取變量<-chanint=readchwritech:=make(chanint)var寫入變量chan<-int=writech3channel通信機制示例:通道變量<-值函數(shù)名:通過make創(chuàng)建好的通道實例參數(shù)列表:可以是變量、常量、表達式或者函數(shù)返回值等,類型必須與ch通道的元素類型一致通道發(fā)送數(shù)據(jù)packagemainfuncmain(){ch:=make(chaninterface{})ch<-0ch<-"hello"}3channel通信機制data:=<-ch執(zhí)行該語句時將會阻塞,直到接收到數(shù)據(jù)并賦值給data變量阻塞接收數(shù)據(jù)data,ok:=<-chdata:表示接收到的數(shù)據(jù)。未接收到數(shù)據(jù)時,data為通道類型的零值非阻塞接收數(shù)據(jù)<-ch執(zhí)行該語句時將會發(fā)生阻塞,直到接收到數(shù)據(jù),但接收到的數(shù)據(jù)會被忽略忽略接收數(shù)據(jù)通道ch是通過遍歷接收數(shù)據(jù)循環(huán)接收數(shù)據(jù)fordata:=rangech{……}3channel通信機制無緩沖的通道:接收前沒有能力保存任何值的通道。這種類型的通道要求發(fā)送goroutine和接收goroutine同時準備好,才能完成發(fā)送和接收操作;阻塞條件:發(fā)送和接收的交互行為是同步的。其中任意一個操作都無法離開另一個操作單獨存在,兩個goroutine沒有同時準備好,通道會導致先執(zhí)行發(fā)送或接收操作的goroutine阻塞等待;無緩沖通道3channel通信機制緩沖的通道:增加一個有限大小的存儲空間形成帶緩沖通道,被接收前能存儲一個或者多個值的通道,不強制要求goroutine之間必須同時完成發(fā)送和接收;有緩沖通道funcmain(){ch:=make(chanint,3)ch<-1ch<-2ch<-3}阻塞條件:只有在通道中沒有要接收的值時,接收動作才會阻塞。只有在通道沒有可用緩沖區(qū)容納被發(fā)送的值時,發(fā)送動作才會阻塞。示例:通道實例:=make(chan通道類型,緩沖大小)3channel通信機制select超時機制select{
case<-chan1:
//chan1成功讀到數(shù)據(jù),進行case處理語句
casechan2<-1:
//成功向chan2寫入數(shù)據(jù),進行case處理語句
default:
//如果上面都沒有成功,進入default處理流程
}funcmain(){ch,exit:=make(chanint),make(chanbool)gofunc(){for{select{casenum:=<-ch:fmt.Println("num=",num)case<-time.After(3*time.Second):exit<-true}}}注:Go語言中提供了select關鍵字,可以同時響應多個通道的操作,select里的每個case語句必須是一個IO操作。04select多路復用select的用法select多路復用語法4select多路復用select多路復用語法select{caseoperator1://statement1caseoprtator2://statement2......default://statement3}select是Go中的一個控制結構。select語句類似于switch語句,但是select會隨機執(zhí)行一個可運行的case。如果沒有case可運行,它將阻塞,直到有case可運行。select是Golang在語言層面提供的多路IO復用的機制,其可以檢測多個channel是否ready(即是否可讀或可寫),使用起來非常方便。select的作用4select多路復用packagemainimport( "fmt" "time")funcmain(){ ch1:=make(chanint) ch2:=make(chanint) gofunc(){ time.Sleep(2*time.Second) ch2<-200 }() gofunc(){ time.Sleep(2*time.Second) ch1<-100 }() select{ casenum1:=<-ch1: fmt.Println(“ch1:",num1) casenum2,ok:=<-ch2: ifok{ fmt.Println(“ch2:",num2) }else{ fmt.Println(“ch2已關閉") } }}運行結果為:可能執(zhí)行第一個case,打印ch1:100也可能執(zhí)行第二個case,打印ch2:200(多次運行,結果就不一樣了)05sync并發(fā)控制互斥鎖、讀寫互斥鎖等待組5sync并發(fā)控制Go語言包中的sync包提供了兩種鎖類型:sync.Mutex和sync.RWMutex。當一個goroutine獲得了Mutex后,其他goroutine必須等到這個goroutine釋放該Mutex。互斥鎖讀寫互斥鎖RWMutex相對友好,在讀鎖占用的情況下,會阻止寫,但不阻止讀。varsyslocksync.Mutexvarsyslocksync.RWMutexvarcountGuardsync.RWMutexfuncGetCount()int{countGuard.RLock()......countGuard.RUnlock()}varcountGuardsyslocksync.Mutexfuncfunc()int{countGuard.Lock()count=c
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度新型股份代持業(yè)務合作協(xié)議書范本
- 2025年度生態(tài)園區(qū)開發(fā)商與綠色物業(yè)合作協(xié)議書
- 2025年度健身中心租賃合同(健康生活)
- 2025年度水電安裝項目安全生產(chǎn)責任合同范本
- 服務消費券的受益群體分析
- 房地產(chǎn)價格走勢與預測
- 2025年度國際貨運代理與物流服務合同-@-1
- 2025年度大型機械設備出口貿(mào)易合同范本
- 2025年度文化創(chuàng)意產(chǎn)業(yè)股東分紅及市場拓展協(xié)議
- 2025年度建筑垃圾處理與循環(huán)經(jīng)濟合作合同模板
- 監(jiān)察部部長崗位職責
- 山西省太原市杏花嶺區(qū)年三年級數(shù)學第一學期期末考試模擬試題含解析
- 《農(nóng)機化促進法解讀》課件
- 最高法院示范文本發(fā)布版3.4民事起訴狀答辯狀示范文本
- 2023-2024學年度上期七年級英語期末試題
- 2024年燃氣輪機值班員技能鑒定理論知識考試題庫-下(多選、判斷題)
- 交通法規(guī)課件
- (優(yōu)化版)高中地理新課程標準【2024年修訂版】
- 《Python程序設計》課件-1:Python簡介與應用領域
- 各類心理量表大全
- DB12T990-2020建筑類建設工程規(guī)劃許可證設計方案規(guī)范
評論
0/150
提交評論