新聞中心
Golang入門(mén)到項(xiàng)目實(shí)戰(zhàn) | golang并發(fā)變成之通道channel
Go提供了一種稱為通道的機(jī)制,用于在goroutine之間共享數(shù)據(jù)。當(dāng)您作為goroutine執(zhí)行并發(fā)活動(dòng)時(shí),需要在goroutine之間共享資源或數(shù)據(jù),通道充當(dāng)goroutine之間的管道(管道)并提供一種機(jī)制來(lái)保證同步交換。
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),富蘊(yùn)企業(yè)網(wǎng)站建設(shè),富蘊(yùn)品牌網(wǎng)站建設(shè),網(wǎng)站定制,富蘊(yùn)網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,富蘊(yùn)網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
根據(jù)數(shù)據(jù)交換的行為,有兩種類(lèi)型的通道:無(wú)緩沖通道和緩沖通道。無(wú)緩沖通道用于執(zhí)行g(shù)oroutine之間的同步通信,而緩沖通道用于執(zhí)行異步通信。無(wú)緩沖通道保證在發(fā)送和接收發(fā)生的瞬間兩個(gè)goroutine之間的交換。緩沖通道沒(méi)有這樣的保證。
通道由make函數(shù)創(chuàng)建,該函數(shù)指定chan關(guān)鍵字和通道的元素類(lèi)型。
這是創(chuàng)建無(wú)緩沖和緩沖通道的代碼塊:
語(yǔ)法
使用內(nèi)置函數(shù)make創(chuàng)建無(wú)緩沖和緩沖通道。make的第一個(gè)參數(shù)需要關(guān)鍵字chan,然后是通道允許交換的數(shù)據(jù)類(lèi)型。
這是將值發(fā)送到通道的代碼塊需要使用-運(yùn)算符:
語(yǔ)法
一個(gè)包含5個(gè)值的緩沖區(qū)的字符串類(lèi)型的goroutine1通道。然后我們通過(guò)通道發(fā)送字符串“Australia”。
這是從通道接收值的代碼塊:
語(yǔ)法
- 運(yùn)算符附加到通道變量(goroutine1)的左側(cè),以接收來(lái)自通道的值。
在無(wú)緩沖通道中,在接收到任何值之前沒(méi)有能力保存它。在這種類(lèi)型的通道中,發(fā)送和接收goroutine在任何發(fā)送或接收操作完成之前的同一時(shí)刻都準(zhǔn)備就緒。如果兩個(gè)goroutine沒(méi)有在同一時(shí)刻準(zhǔn)備好,則通道會(huì)讓執(zhí)行其各自發(fā)送或接收操作的goroutine首先等待。同步是通道上發(fā)送和接收之間交互的基礎(chǔ)。沒(méi)有另一個(gè)就不可能發(fā)生。
在緩沖通道中,有能力在接收到一個(gè)或多個(gè)值之前保存它們。在這種類(lèi)型的通道中,不要強(qiáng)制goroutine在同一時(shí)刻準(zhǔn)備好執(zhí)行發(fā)送和接收。當(dāng)發(fā)送和接收阻塞時(shí)也有不同的條件。只有當(dāng)通道中沒(méi)有要接收的值時(shí),接收才會(huì)阻塞。僅當(dāng)沒(méi)有可用緩沖區(qū)來(lái)放置正在發(fā)送的值時(shí),發(fā)送才會(huì)阻塞。
實(shí)例
運(yùn)行結(jié)果
Go CSP并發(fā)模型
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 是 Communicating Sequential Process 的簡(jiǎn)稱,中文可以叫做通信順序進(jìn)程,是一種并發(fā)編程模型,由 Tony Hoare 于 1977 年提出。簡(jiǎn)單來(lái)說(shuō),CSP 模型由并發(fā)執(zhí)行的實(shí)體(線程或者進(jìn)程)所組成,實(shí)體之間通過(guò)發(fā)送消息進(jìn)行通信,這里發(fā)送消息時(shí)使用的就是通道,或者叫 channel。CSP 模型的關(guān)鍵是關(guān)注 channel,而不關(guān)注發(fā)送消息的實(shí)體。 Go 語(yǔ)言實(shí)現(xiàn)了 CSP 部分理論 。
“ 不要以共享內(nèi)存的方式來(lái)通信,相反, 要通過(guò)通信來(lái)共享內(nèi)存?!?/p>
Go的CSP并發(fā)模型,是通過(guò) goroutine和channel 來(lái)實(shí)現(xiàn)的。
goroutine 是Go語(yǔ)言中并發(fā)的執(zhí)行單位。其實(shí)就是協(xié)程。
channel是Go語(yǔ)言中各個(gè)并發(fā)結(jié)構(gòu)體(goroutine)之前的通信機(jī)制。 通俗的講,就是各個(gè)goroutine之間通信的”管道“,有點(diǎn)類(lèi)似于Linux中的管道。
Channel
Goroutine
Go并發(fā)編程之美-CAS操作
摘要: 一、前言 go語(yǔ)言類(lèi)似Java JUC包也提供了一些列用于多線程之間進(jìn)行同步的措施,比如低級(jí)的同步措施有 鎖、CAS、原子變量操作類(lèi)。相比Java來(lái)說(shuō)go提供了獨(dú)特的基于通道的同步措施。本節(jié)我們先來(lái)看看go中CAS操作 二、CAS操作 go中的Cas操作與java中類(lèi)似,都是借用了CPU提供的原子性指令來(lái)實(shí)現(xiàn)。
go語(yǔ)言類(lèi)似Java JUC包也提供了一些列用于多線程之間進(jìn)行同步的措施,比如低級(jí)的同步措施有 鎖、CAS、原子變量操作類(lèi)。相比Java來(lái)說(shuō)go提供了獨(dú)特的基于通道的同步措施。本節(jié)我們先來(lái)看看go中CAS操作
go中的Cas操作與java中類(lèi)似,都是借用了CPU提供的原子性指令來(lái)實(shí)現(xiàn)。CAS操作修改共享變量時(shí)候不需要對(duì)共享變量加鎖,而是通過(guò)類(lèi)似樂(lè)觀鎖的方式進(jìn)行檢查,本質(zhì)還是不斷的占用CPU 資源換取加鎖帶來(lái)的開(kāi)銷(xiāo)(比如上下文切換開(kāi)銷(xiāo))。下面一個(gè)例子使用CAS來(lái)實(shí)現(xiàn)計(jì)數(shù)器
go中CAS操作具有原子性,在解決多線程操作共享變量安全上可以有效的減少使用鎖所帶來(lái)的開(kāi)銷(xiāo),但是這是使用cpu資源做交換的。
我簡(jiǎn)單列舉了并發(fā)編程的大綱,需要詳細(xì)的私信“555”~~
網(wǎng)頁(yè)名稱:go語(yǔ)言的并發(fā) go語(yǔ)言并發(fā)之道 pdf
標(biāo)題路徑:http://fisionsoft.com.cn/article/ddoocjs.html