Go語(yǔ)言
成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括東川網(wǎng)站建設(shè)、東川網(wǎng)站制作、東川網(wǎng)頁(yè)制作以及東川網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,東川網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到東川省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
Go(又稱(chēng)Golang)是Google開(kāi)發(fā)的一種靜態(tài)強(qiáng)類(lèi)型、編譯型、并發(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)概念上的”線程“類(lèi)似,可以理解為”線程“。
channel是Go語(yǔ)言中各個(gè)并發(fā)結(jié)構(gòu)體(goroutine)之前的通信機(jī)制。 通俗的講,就是各個(gè)goroutine之間通信的”管道“,有點(diǎn)類(lèi)似于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)注創(chuàng)新互聯(lián)其它相關(guān)文章!
文章題目:go語(yǔ)言的并發(fā)模型
文章源于:http://weahome.cn/article/ggdchd.html