Go的併發沒有它,就像iphone沒有網路一樣
Go的併發沒有它,就像iphone沒有網路一樣
簡介
Golang的併發屬性是該語言的一個大殺器,說到併發就不能不提Channel
,你可以把它看成一個管道,透過它併發核心單元就可以傳送或者接收資料進行通訊。這篇文章來深入瞭解一下 channel。
channel 的設計是基於 CSP 模型的。CSP 是 Communicating Sequential Process 的簡稱,中文可以叫做通訊順序程式,是一種併發程式設計模型,由 於 1977 年提出。簡單來說,CSP 模型由併發執行的實體(執行緒或者程式)所組成,實體之間透過傳送訊息進行通訊,這裡傳送訊息時使用的就是通道,或者叫 channel。CSP 模型的關鍵是關注 channel,而不關注傳送訊息的實體。Go 語言實現了 CSP 部分理論,goroutine 對應 CSP 中併發執行的實體,channel 也就對應著 CSP 中的 channel。
建立Channel
Go中的Channel使用
chan
作為關鍵字。無緩衝chan情況下,傳送和接收會一直阻塞著,直到另一方準備好。這種方式可以用來在gororutine中進行同步,- 而需要使用鎖或者條件變數。
有緩衝chan,可以儘量避免阻塞,提高應用的效能,典型的以時間換空間。
aChan := make(chan int) // 建立無緩衝chanbChan := make(chan int, N) // 建立緩衝為N的chan
賦值和取值
從以下程式碼中看不出它的巨大作用,很正常,那是因為他們兩條語句通常不在一起,例如:協程A傳送資料,協程B接收資料。
mchanSelect
Selsect是獲取Channel中資料的最常用方式。
select 一定程度上可以類比於 linux 中的 IO 多路複用中的 select。後者相當於提供了對多個 IO 事件的統一管理,而 Golang 中的 select 相當於提供了對多個 channel 的統一管理。當然這只是 select 在 channel 上的一種使用方法。
func main(){ ch1 := make(chan int, 1) ch2 := make(chan int, 1) select { case e1 :=for...range
for …… range語句可以處理Channel。
go func() { time.Sleep(1 * time.Hour) }() c := make(chan int) go func() { for i := 0; itimeout
Select很重要的一個應用就是超時處理。 因為上面提供的demo,select語句就會一直阻塞著。這時候我們可能就需要一個超時操作,用來處理超時的情況。下面這個例子我們會在2秒後往channel c1中傳送一個資料,但是Select設定為1秒超時,因此我們會列印出timeout 1,而不是result 1。
c1 := make(chan string, 1) go func() { time.Sleep(time.Second * 2) c1close
Go內建的close方法就可以用來關閉channel。但如果channel 已經被關閉,繼續往它傳送資料會導致panic: send on closed channel:
close(mChan)推薦閱讀:
作者:freelang
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2618/viewspace-2804994/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ubuntu沒有有線網路的一種解決辦法Ubuntu
- 最好的 Go 框架:沒有框架?Go框架
- 資訊圖:沒有網際網路的世界
- 網際網路從此沒有 BATBAT
- 有沒有關於go 的富文字外掛Go
- 有沒有什麼網路請求攔截的庫?
- 有沒有人見過這樣的開發工具?
- 有沒有support這樣的開源軟體
- 網際網路產品——沒有個性
- 如果沒有Java 人類就像不會說話的嬰兒Java
- 有沒有和laravel一樣的golang框架!請推薦一下!LaravelGolang框架
- 查劫持網路方法,如何檢視網路有沒有被DNS劫持?DNS
- 電腦沒有網路介面卡解決方法教程 沒有網路介面卡怎麼解決?
- 網際網路服務沒有免費午餐
- 沒有開源,生活竟是這樣的......
- 沒有需求就沒有軟體 (轉)
- 沒有介面就沒有設計模式設計模式
- react 有沒有類似vue中watch這樣的api?ReactVueAPI
- 沒有Wi-Fi?三種方法透過iPhone讓Macbook連上網路iPhoneMac
- 有沒有通過網頁線上使用的CRM?網頁
- java有沒有gotoJavaGo
- PHP轉Java有沒有好的學習路線PHPJava
- 如果你的網站沒有JavaScript網站JavaScript
- 我沒有見過這樣的黃昏
- 請問有沒有GO語言寫的探測區域網QQ的工具啊Go
- go怎麼沒有條件編譯Go編譯
- 《網路安全法》正式施行網路風險面前沒有看客
- 99%的程式都沒有考慮的網路異常
- 用github Pages生成的網頁沒有樣式,怎麼破?Github網頁
- 有沒有在南昌的小夥伴,就業怎麼樣啊就業
- 有沒有一兩萬的創業專案創業
- CDN百科 | 假如沒有CDN,網路世界會變成什麼樣?
- 如果沒有 Android,世界會怎樣?Android
- 為什麼日本德國沒有一流網際網路企業?
- 沒有光模組就沒有光通訊,真的嗎?
- 樹莓派無線上網時,怎麼查它的ip(沒有螢幕)?樹莓派
- 掘金相親:讓網際網路沒有單身狗
- 2009中國網際網路:沒有懸念