golang并發(fā)編程的實(shí)現(xiàn)
go
main函數(shù)的執(zhí)行本身就是一個(gè)協(xié)程,當(dāng)使用go關(guān)鍵字的時(shí)候,就會(huì)創(chuàng)建一個(gè)新的協(xié)程
channel
channel 管道,用于在多個(gè)協(xié)程之間傳遞信號(hào)
無(wú)緩存管道
當(dāng)對(duì)無(wú)緩沖通道寫(xiě)的時(shí)候,會(huì)一直阻塞等到某個(gè)協(xié)程對(duì)這個(gè)緩沖通道讀
阻塞場(chǎng)景:
- 通道中無(wú)數(shù)據(jù),但執(zhí)行讀通道。
- 通道中無(wú)數(shù)據(jù),向通道寫(xiě)數(shù)據(jù),但無(wú)協(xié)程讀取。
綜上,無(wú)緩存通道的讀寫(xiě)必須同時(shí)存在,且讀寫(xiě)分別在兩個(gè)不同的協(xié)程
func main(){
ch := make(chan int)
go func(ch chan int){
ch <-222
}(ch)
println(<-ch)
}
有緩沖管道
有緩存時(shí)可以向通道中寫(xiě)入數(shù)據(jù)后直接返回,緩存中有數(shù)據(jù)時(shí)可以從通道中讀到數(shù)據(jù)直接返回,這時(shí)有緩存通道是不會(huì)阻塞的
阻塞場(chǎng)景:
- 通道的緩存無(wú)數(shù)據(jù),但執(zhí)行讀通道。
- 通道的緩存已經(jīng)占滿(mǎn),向通道寫(xiě)數(shù)據(jù),但無(wú)協(xié)程讀。
綜上,有緩沖通道的讀寫(xiě)必須在兩個(gè)不同協(xié)程
func main() {
ch := make(chan int, 1) //長(zhǎng)度為1的緩沖管道也是有緩沖管道
ch <- 333
go func(ch chan int) {
println(<-ch)
}(ch)
ch <- 333
}
sync.Mutex 和 sync.RwMutex
sync.Mutex 并發(fā)鎖,一次只可以加載一個(gè)并發(fā)鎖
sync.RwMutex 讀寫(xiě)鎖,一次可以加載多個(gè)讀鎖和一個(gè)寫(xiě)鎖。當(dāng)寫(xiě)鎖存在時(shí)候,不能再加載讀鎖和寫(xiě)鎖
sync.WaitGroup
阻塞等待所有任務(wù)完成之后再繼續(xù)執(zhí)行
WaitGroup在不方法中傳遞,需要傳指針
func main() {
var wg sync.WaitGroup
ch := make(chan int, 1000)
for i := 0; i < 1000; i++ {
wg.Add(1)
go doSomething(i, &wg, ch)
}
wg.Wait()
fmt.Println("all done")
for i := 0; i < 1000; i++ {
dd := <-ch
fmt.Println("from ch:"+strconv.Itoa(dd))
}
}
func doSomething(index int, wg *sync.WaitGroup, ch chan int) {
defer wg.Done()
fmt.Println("start done:" + strconv.Itoa(index))
//time.Sleep(20 * time.Millisecond)
ch <- index
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Goland 的安裝及激活教程(window、linux下安裝)
這篇文章主要介紹了Golang Goland 的安裝及激活詳細(xì)教程,包括window下安裝goland和linux下安裝goland,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Go語(yǔ)言并發(fā)之context標(biāo)準(zhǔn)庫(kù)的使用詳解
Context的出現(xiàn)是為了解決在大型應(yīng)用程序中的并發(fā)環(huán)境下,協(xié)調(diào)和管理多個(gè)goroutine之間的通信、超時(shí)和取消操作的問(wèn)題,本文就來(lái)和大家簡(jiǎn)單聊聊它的具體用法,希望對(duì)大家有所幫助2023-06-06
go-micro開(kāi)發(fā)RPC服務(wù)以及運(yùn)行原理介紹
這篇文章介紹了go-micro開(kāi)發(fā)RPC服務(wù)的方法及其運(yùn)行原理,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
利用Golang實(shí)現(xiàn)TCP連接的雙向拷貝詳解
公司中遇到了一個(gè)使用golang編寫(xiě)的agent程序,所以這篇文章主要給大家介紹了關(guān)于利用Go如何實(shí)現(xiàn)TCP連接的雙向拷貝的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考,下面隨著小編來(lái)一起看看吧。2017-09-09

