Go語言_並發篇

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

  http://www.cnblogs.com/yjf512/archive/2012/06/06/2537712.html

                                                                                                           Go語言_並發篇

2012-06-06 09:55        by        軒脈刃, 

當被問到為什麼用Go語言,一定不得不提的是Go語言的並發程式編寫。在C語言中編寫非常繁瑣複雜的並發程式在Go語言中總是顯得如此便捷。

Go中並發程式依靠的是兩個:goroutine和channel

理解什麼是goroutine?

對於初學者,goroutine直接理解成為線程就可以了。當對一個函數調用go,啟動一個goroutine的時候,就相當於起來一個線程,執行這個函數。

實際上,一個goroutine並不相當於一個線程,goroutine的出現正是為了替代原來的線程概念成為最小的調度單位。一旦運行goroutine時,先去當先線程尋找,如果線程阻塞了,則被分配到閒置線程,如果沒有閒置線程,那麼就會建立一個線程。注意的是,當goroutine執行完畢後,線程不會回收推出,而是成為了閒置線程。

關於goroutine的理解,推薦看這個文章:http://groups.google.com/group/golang-china/browse_thread/thread/0e9d683ca766ec00

goroutine的使用

使用非常簡單,在函數前增加一個go

f(11)

go f(11) //這個是讓f()函數作為goroutine運行

但是go有一個缺點,主線程要等待一個goroutine結束再處理怎麼辦?拿《學習go語言》中的一個例子說明。

這裡的第18行為什麼要sleep? 這裡是為了等上面兩個go ready處理完成。

好了,這裡就出來了一個需求:一個goroutine結束後必須要向主線程傳輸資料,告訴主線程這個goroutine已經結束了。

這裡就引進了channel的概念

channel的使用

channel的意思用白話可以這麼理解:主線程告訴大家你開goroutine可以,但是我在我的主線程開了一個管道,你做完了你要做的事情之後,往管道裡面塞個東西告訴我你已經完成了。

上面的例子就可以改為:

從這個程式得到的幾點資訊:

1 channel只能使用make來進行建立

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

int是說明這個管道能傳輸什麼類型的資料

2 往channel中插入資料的操作

c <- 1

是不是很形象

3 從channel中輸出資料

<- c

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

因為2和3啟動了兩個goroutine,每個goroutine都往管道輸出一個1,因此主線程要接收兩次才能說明兩個goroutine都結束了

channel的進一步理解:

http://blog.dccmx.com/2011/05/magic-of-channel-in-go/

http://blog.dccmx.com/2012/03/small-problem-about-goroutine/

channel分為兩種:一種是有buffer的,一種是沒有buffer的,預設是沒有buffer的

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

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

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

有緩衝的channel,因此要注意“放”先於“取”

無緩衝的channel,因此要注意“取”先於“放”

http://blog.dccmx.com/2011/05/magic-of-channel-in-go/ 裡面的一個例子很好:

同樣要先輸出hello world,使用有緩衝的channel和無緩衝的channel分別是這樣的:

有緩衝的channel:

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

這裡有個緩衝,因此放入資料的操作c<- 0先於取資料操作 <-c

無緩衝的channel:

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

由於c是無緩衝的channel,因此必須保證取操作<-c 先於放操作c<- 0

參考文檔:

Go語言中的channel魔法

http://blog.dccmx.com/2011/05/magic-of-channel-in-go/

談點對goroutine的理解

http://comments.gmane.org/gmane.comp.lang.go.china/676

goroutine效果測試

http://webcache.googleusercontent.com/search?q=cache:Vwa9TGfQKtoJ:blog.weizhe.net/tag/goroutine%2520golang+&cd=6&hl=en&ct=clnk

Effective Go

http://golang.org/doc/effective_go.html#goroutines

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.