golang中的并發(fā)是怎么實(shí)現(xiàn)的

golang中的并發(fā)是怎么實(shí)現(xiàn)的?可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

目前成都創(chuàng)新互聯(lián)公司已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、虛擬空間、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、武威網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

Go中并發(fā)程序依靠的是兩個(gè):goroutine和channel

理解什么是goroutine?

對(duì)于初學(xué)者,goroutine直接理解成為線程就可以了。當(dāng)對(duì)一個(gè)函數(shù)調(diào)用go,啟動(dòng)一個(gè)goroutine的時(shí)候,就相當(dāng)于起來(lái)一個(gè)線程,執(zhí)行這個(gè)函數(shù)。

實(shí)際上,一個(gè)goroutine并不相當(dāng)于一個(gè)線程,goroutine的出現(xiàn)正是為了替代原來(lái)的線程概念成為最小的調(diào)度單位。

一旦運(yùn)行g(shù)oroutine時(shí),先去當(dāng)先線程查找,如果線程阻塞了,則被分配到空閑的線程,如果沒有空閑的線程,那么就會(huì)新建一個(gè)線程。注意的是,當(dāng)goroutine執(zhí)行完畢后,線程不會(huì)回收推出,而是成為了空閑的線程。

goroutine的使用

使用非常簡(jiǎn)單,在函數(shù)前增加一個(gè)go

f(11)

go f(11) //這個(gè)是讓f()函數(shù)作為goroutine運(yùn)行

但是go有一個(gè)缺點(diǎn),主線程要等待一個(gè)goroutine結(jié)束再處理怎么辦?拿《學(xué)習(xí)go語(yǔ)言》中的一個(gè)例子說(shuō)明。

golang中的并發(fā)是怎么實(shí)現(xiàn)的

這里的第18行為什么要sleep? 這里是為了等上面兩個(gè)go ready處理完成。

好了,這里就出來(lái)了一個(gè)需求:一個(gè)goroutine結(jié)束后必須要向主線程傳輸數(shù)據(jù),告訴主線程這個(gè)goroutine已經(jīng)結(jié)束了。

這里就引進(jìn)了channel的概念

channel的使用

channel的意思用白話可以這么理解:主線程告訴大家你開goroutine可以,但是我在我的主線程開了一個(gè)管道,你做完了你要做的事情之后,往管道里面塞個(gè)東西告訴我你已經(jīng)完成了。

上面的例子就可以改為:

golang中的并發(fā)是怎么實(shí)現(xiàn)的

從這個(gè)程序得到的幾點(diǎn)信息:

1 channel只能使用make來(lái)進(jìn)行創(chuàng)建

基本格式是 c := make(chan int)

int是說(shuō)明這個(gè)管道能傳輸什么類型的數(shù)據(jù)

2 往channel中插入數(shù)據(jù)的操作

c <- 1

是不是很形象

3 從channel中輸出數(shù)據(jù)

<- c

4 為什么需要輸出兩次(4和5兩行?)

因?yàn)?和3啟動(dòng)了兩個(gè)goroutine,每個(gè)goroutine都往管道輸出一個(gè)1,因此主線程要接收兩次才能說(shuō)明兩個(gè)goroutine都結(jié)束了

channel的進(jìn)一步理解:

channel分為兩種:一種是有buffer的,一種是沒有buffer的,默認(rèn)是沒有buffer的

ci := make(chan int) //無(wú)buffer

cj := make(chan int, 0) //無(wú)buffer

cs := make(chan int, 100) //有buffer

有緩沖的channel,因此要注意“放”先于“取”

無(wú)緩沖的channel,因此要注意“取”先于“放”

同樣要先輸出hello world,使用有緩沖的channel和無(wú)緩沖的channel分別是這樣的:

有緩沖的channel:

var a string
var c = make(chan int, 10)
  
func f() {
    a = "hello, world"
    c <- 0
}
  
func main() {
    go f()
    <-c
    print(a)
 
}

這里有個(gè)緩沖,因此放入數(shù)據(jù)的操作c<- 0先于取數(shù)據(jù)操作 <-c

無(wú)緩沖的channel:

var a string
var c = make(chan int)
  
func f() {
    a = "hello, world"
    <-c
}
  
func main() {
    go f()
    c <- 0
    print(a)
 
}

由于c是無(wú)緩沖的channel,因此必須保證取操作<-c 先于放操作c<- 0

看完上述內(nèi)容,你們對(duì)golang中的并發(fā)實(shí)現(xiàn)有進(jìn)一步的了解嗎?如果還想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀。

本文標(biāo)題:golang中的并發(fā)是怎么實(shí)現(xiàn)的
轉(zhuǎn)載來(lái)于:http://bm7419.com/article12/psdogc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管微信小程序、App設(shè)計(jì)、網(wǎng)站改版、搜索引擎優(yōu)化、小程序開發(fā)

廣告

聲明:本網(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)

微信小程序開發(fā)