溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

go語(yǔ)言的并發(fā)模型

發(fā)布時(shí)間:2020-06-09 15:10:42 來(lái)源:億速云 閱讀:203 作者:元一 欄目:編程語(yǔ)言

Go語(yǔ)言

Go(又稱Golang)是Google開(kāi)發(fā)的一種靜態(tài)強(qiáng)類型、編譯型、并發(fā)型,并具有垃圾回收功能的編程語(yǔ)言。

羅伯特·格瑞史莫(Robert Griesemer),羅勃·派克(Rob Pike)及肯·湯普遜(Ken Thompson)于2007年9月開(kāi)始設(shè)計(jì)Go,稍后Ian Lance Taylor、Russ Cox加入項(xiàng)目。Go是基于Inferno操作系統(tǒng)所開(kāi)發(fā)的。Go于2009年11月正式宣布推出,成為開(kāi)放源代碼項(xiàng)目,并在Linux及Mac OS X平臺(tái)上進(jìn)行了實(shí)現(xiàn),后來(lái)追加了Windows系統(tǒng)下的實(shí)現(xiàn)。在2016年,Go被軟件評(píng)價(jià)公司TIOBE 選為“TIOBE 2016 年最佳語(yǔ)言”。 目前,Go每半年發(fā)布一個(gè)二級(jí)版本(即從a.x升級(jí)到a.y)。

Go的CSP并發(fā)模型

Go實(shí)現(xiàn)了兩種并發(fā)形式。第一種是大家普遍認(rèn)知的:多線程共享內(nèi)存。其實(shí)就是Java或者C++等語(yǔ)言中的多線程開(kāi)發(fā)。

另外一種是Go語(yǔ)言特有的,也是Go語(yǔ)言推薦的:CSP(communicating sequential processes)并發(fā)模型。

CSP并發(fā)模型是在1970年左右提出的概念,屬于比較新的概念,不同于傳統(tǒng)的多線程通過(guò)共享內(nèi)存來(lái)通信,CSP講究的是“以通信的方式來(lái)共享內(nèi)存”。

請(qǐng)記住下面這句話:

Do not communicate by sharing memory; instead, share memory by communicating.
“不要以共享內(nèi)存的方式來(lái)通信,相反,要通過(guò)通信來(lái)共享內(nèi)存?!?/pre>

普通的線程并發(fā)模型,就是像Java、C++、或者Python,他們線程間通信都是通過(guò)共享內(nèi)存的方式來(lái)進(jìn)行的。

非常典型的方式就是,在訪問(wèn)共享數(shù)據(jù)(例如數(shù)組、Map、或者某個(gè)結(jié)構(gòu)體或?qū)ο螅┑臅r(shí)候,通過(guò)鎖來(lái)訪問(wèn),因此,在很多時(shí)候,衍生出一種方便操作的數(shù)據(jù)結(jié)構(gòu),叫做“線程安全的數(shù)據(jù)結(jié)構(gòu)”。

例如Java提供的包”java.util.concurrent”中的數(shù)據(jù)結(jié)構(gòu)。Go中也實(shí)現(xiàn)了傳統(tǒng)的線程并發(fā)模型。

Go的CSP并發(fā)模型,是通過(guò)goroutine和channel來(lái)實(shí)現(xiàn)的。

goroutine 是Go語(yǔ)言中并發(fā)的執(zhí)行單位。有點(diǎn)抽象,其實(shí)就是和傳統(tǒng)概念上的”線程“類似,可以理解為”線程“。

channel是Go語(yǔ)言中各個(gè)并發(fā)結(jié)構(gòu)體(goroutine)之前的通信機(jī)制。 通俗的講,就是各個(gè)goroutine之間通信的”管道“,有點(diǎn)類似于Linux中的管道。

生成一個(gè)goroutine的方式非常的簡(jiǎn)單:Go一下,就生成了。

go f();

通信機(jī)制channel也很方便,傳數(shù)據(jù)用channel <- data,取數(shù)據(jù)用<-channel。

在通信過(guò)程中,傳數(shù)據(jù)channel <- data和取數(shù)據(jù)<-channel必然會(huì)成對(duì)出現(xiàn),因?yàn)檫@邊傳,那邊取,兩個(gè)goroutine之間才會(huì)實(shí)現(xiàn)通信。

而且不管傳還是取,必阻塞,直到另外的goroutine傳或者取為止。

有兩個(gè)goroutine,其中一個(gè)發(fā)起了向channel中發(fā)起了傳值操作。(goroutine為矩形,channel為箭頭)

以上就是golang 如何并發(fā)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注億速云其它相關(guān)文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI