61396-Go語言程序設(shè)計(jì)項(xiàng)目化教程(微課版)5.2 并發(fā)_第1頁
61396-Go語言程序設(shè)計(jì)項(xiàng)目化教程(微課版)5.2 并發(fā)_第2頁
61396-Go語言程序設(shè)計(jì)項(xiàng)目化教程(微課版)5.2 并發(fā)_第3頁
61396-Go語言程序設(shè)計(jì)項(xiàng)目化教程(微課版)5.2 并發(fā)_第4頁
61396-Go語言程序設(shè)計(jì)項(xiàng)目化教程(微課版)5.2 并發(fā)_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

并發(fā)并發(fā)簡述goroutine調(diào)度select多路復(fù)用01.02.04.目錄channel通信機(jī)制03.sync并發(fā)控制05.01并發(fā)簡述進(jìn)程,線程與協(xié)程并發(fā)與并行并發(fā)模型1并發(fā)簡述線程進(jìn)程協(xié)程進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的最小單位,由內(nèi)核進(jìn)行調(diào)度,擁有獨(dú)立的內(nèi)存單元。一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行。線程是CPU調(diào)度的最小單位,比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位,線程分為內(nèi)核態(tài)線程和用戶態(tài)線程,一個(gè)線程上可以運(yùn)行多個(gè)協(xié)程。協(xié)程是輕量級的線程,獨(dú)立的??臻g,共享堆空間,調(diào)度由用戶自己控制。協(xié)程無法強(qiáng)制的切換CPU控制權(quán),通常只能進(jìn)行協(xié)作式調(diào)度。1并發(fā)簡述ABC并發(fā)是多線程程序在單核心的cpu上運(yùn)行,一個(gè)時(shí)間段內(nèi)存在多個(gè)線程或進(jìn)程執(zhí)行,但任何時(shí)間點(diǎn)上都只有一個(gè)線程或進(jìn)程執(zhí)行,多個(gè)線程或進(jìn)程爭搶時(shí)間片輪流執(zhí)行,單核處理器只能并發(fā)。并發(fā)1并發(fā)簡述ABC并行是多線程程序在多核心的cpu上運(yùn)行,一個(gè)時(shí)間段和時(shí)間點(diǎn)存在多個(gè)線程或進(jìn)程執(zhí)行,利用多核實(shí)現(xiàn)多線程的運(yùn)行,并行需要多核處理器。并行1并發(fā)簡述并發(fā)模型多進(jìn)程編程多進(jìn)程是在操作系統(tǒng)層面進(jìn)行并發(fā)的基本模式,所有的進(jìn)程由內(nèi)核管理,相互之間不會(huì)影響,但系統(tǒng)開銷較大。多協(xié)程編程用戶態(tài)線程,不需要操作系統(tǒng)來進(jìn)行搶占式調(diào)度,且在真正的實(shí)現(xiàn)中寄存于線程中,系統(tǒng)開銷極小。多線程編程大部分操作系統(tǒng)上都屬于系統(tǒng)層面的并發(fā)模式,比多進(jìn)程的開銷小很多,但是其開銷依舊比較大,且在高并發(fā)模式下,效率會(huì)有影響。非阻塞/異步IO編程比多線程要復(fù)雜,通過事件驅(qū)動(dòng)的方式使用異步IO,盡可能地少用線程,降低開銷。02goroutine調(diào)度goroutine定義普通函數(shù)創(chuàng)建goroutine匿名函數(shù)創(chuàng)建goroutine任何函數(shù)加上go就能發(fā)送調(diào)度器運(yùn)行;不需要定義時(shí)區(qū)分是否異步函數(shù);調(diào)度器在合適的點(diǎn)進(jìn)行切換;使用-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ù)列表:啟動(dòng)goroutine時(shí),需要向匿名函數(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)}運(yùn)行結(jié)果為:并發(fā)1并發(fā)2………..main函數(shù)中通過go關(guān)鍵字創(chuàng)建running函數(shù)goroutine并發(fā)運(yùn)行;running函數(shù)中通過for實(shí)現(xiàn)無限循環(huán),time.Sleep暫停1秒后繼續(xù)循環(huán),主函數(shù)退出時(shí)并發(fā)程序終止;2goroutine調(diào)度funcmain(){gofunc(){vartimesintfor{times++fmt.Println("并發(fā)",times)time.Sleep(time.Second)}}()}運(yùn)行結(jié)果為:并發(fā)1并發(fā)2……..main函數(shù)中通過go關(guān)鍵字創(chuàng)建匿名函數(shù)goroutine并發(fā)運(yùn)行;匿名函數(shù)中通過for實(shí)現(xiàn)無限循環(huán),time.Sleep暫停1秒后繼續(xù)循環(huán),主函數(shù)退出時(shí)并發(fā)程序終止;03channel通信機(jī)制通道的特性通道的聲明通道數(shù)據(jù)接收與發(fā)送無緩沖通道有緩沖通道通道超時(shí)機(jī)制3channel通信機(jī)制Go語言中的通道(channel)是一種特殊的類型。在任何時(shí)候,同時(shí)只能有一個(gè)goroutine訪問通道進(jìn)行發(fā)送和獲取數(shù)據(jù)。goroutine間通過通道就可以通信。通道像一個(gè)傳送帶或者隊(duì)列,總是遵循先入先出(FirstInFirstOut)的規(guī)則,保證收發(fā)數(shù)據(jù)的順序。通道(channel)var通道變量通道類型注:chan類型的空值是nil,聲明后需要配合make后才能使用1、聲明通道類型3channel通信機(jī)制通道實(shí)例:=make(數(shù)據(jù)類型)2、創(chuàng)建通道var通道實(shí)例<-chan數(shù)據(jù)類型3、聲明讀取單向通道var通道實(shí)例chan<-數(shù)據(jù)類型4、聲明寫入單向通道readch:=make(chanint)writech:=make(chanint)readch:=make(chanint)var讀取變量<-chanint=readchwritech:=make(chanint)var寫入變量chan<-int=writech3channel通信機(jī)制示例:通道變量<-值函數(shù)名:通過make創(chuàng)建好的通道實(shí)例參數(shù)列表:可以是變量、常量、表達(dá)式或者函數(shù)返回值等,類型必須與ch通道的元素類型一致通道發(fā)送數(shù)據(jù)packagemainfuncmain(){ch:=make(chaninterface{})ch<-0ch<-"hello"}3channel通信機(jī)制data:=<-ch執(zhí)行該語句時(shí)將會(huì)阻塞,直到接收到數(shù)據(jù)并賦值給data變量阻塞接收數(shù)據(jù)data,ok:=<-chdata:表示接收到的數(shù)據(jù)。未接收到數(shù)據(jù)時(shí),data為通道類型的零值非阻塞接收數(shù)據(jù)<-ch執(zhí)行該語句時(shí)將會(huì)發(fā)生阻塞,直到接收到數(shù)據(jù),但接收到的數(shù)據(jù)會(huì)被忽略忽略接收數(shù)據(jù)通道ch是通過遍歷接收數(shù)據(jù)循環(huán)接收數(shù)據(jù)fordata:=rangech{……}3channel通信機(jī)制無緩沖的通道:接收前沒有能力保存任何值的通道。這種類型的通道要求發(fā)送goroutine和接收goroutine同時(shí)準(zhǔn)備好,才能完成發(fā)送和接收操作;阻塞條件:發(fā)送和接收的交互行為是同步的。其中任意一個(gè)操作都無法離開另一個(gè)操作單獨(dú)存在,兩個(gè)goroutine沒有同時(shí)準(zhǔn)備好,通道會(huì)導(dǎo)致先執(zhí)行發(fā)送或接收操作的goroutine阻塞等待;無緩沖通道3channel通信機(jī)制緩沖的通道:增加一個(gè)有限大小的存儲(chǔ)空間形成帶緩沖通道,被接收前能存儲(chǔ)一個(gè)或者多個(gè)值的通道,不強(qiáng)制要求goroutine之間必須同時(shí)完成發(fā)送和接收;有緩沖通道funcmain(){ch:=make(chanint,3)ch<-1ch<-2ch<-3}阻塞條件:只有在通道中沒有要接收的值時(shí),接收動(dòng)作才會(huì)阻塞。只有在通道沒有可用緩沖區(qū)容納被發(fā)送的值時(shí),發(fā)送動(dòng)作才會(huì)阻塞。示例:通道實(shí)例:=make(chan通道類型,緩沖大小)3channel通信機(jī)制select超時(shí)機(jī)制select{

case<-chan1:

//chan1成功讀到數(shù)據(jù),進(jìn)行case處理語句

casechan2<-1:

//成功向chan2寫入數(shù)據(jù),進(jìn)行case處理語句

default:

//如果上面都沒有成功,進(jìn)入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關(guān)鍵字,可以同時(shí)響應(yīng)多個(gè)通道的操作,select里的每個(gè)case語句必須是一個(gè)IO操作。04select多路復(fù)用select的用法select多路復(fù)用語法4select多路復(fù)用select多路復(fù)用語法select{caseoperator1://statement1caseoprtator2://statement2......default://statement3}select是Go中的一個(gè)控制結(jié)構(gòu)。select語句類似于switch語句,但是select會(huì)隨機(jī)執(zhí)行一個(gè)可運(yùn)行的case。如果沒有case可運(yùn)行,它將阻塞,直到有case可運(yùn)行。select是Golang在語言層面提供的多路IO復(fù)用的機(jī)制,其可以檢測多個(gè)channel是否ready(即是否可讀或可寫),使用起來非常方便。select的作用4select多路復(fù)用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已關(guān)閉") } }}運(yùn)行結(jié)果為:可能執(zhí)行第一個(gè)case,打印ch1:100也可能執(zhí)行第二個(gè)case,打印ch2:200(多次運(yùn)行,結(jié)果就不一樣了)05sync并發(fā)控制互斥鎖、讀寫互斥鎖等待組5sync并發(fā)控制Go語言包中的sync包提供了兩種鎖類型:sync.Mutex和sync.RWMutex。當(dāng)一個(gè)goroutine獲得了Mutex后,其他goroutine必須等到這個(gè)goroutine釋放該Mutex?;コ怄i讀寫互斥鎖RWMutex相對友好,在讀鎖占用的情況下,會(huì)阻止寫,但不阻止讀。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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論