golang-goruntime與channel:高效的channel

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

golang有兩個非常大的特性,那就是goruntime與channel,這兩個特性直接將開發人員從並發和線程同步中解放了出來,使高並發和線程同步之間代碼的編寫變得異常簡單,並且佔用資源少,同步傳輸效率高。

        資源佔用方面,goroutine 會從4096位元組的初始棧記憶體佔用開始按需增長或縮減記憶體佔用。同步傳輸效率方面,我曾經在松本行弘的《代碼的未來》一書上看到一個簡潔的例子(書上的代碼中行末帶有分號,目前golang中已經取消了原始碼中行末的分號,由編譯器代為添加,一行程式碼封裝含多個語句則需要分號分隔)。下列代碼在原代碼基礎上做了適當調整。


package main  import (  "fmt"  "time" )  func chanFlow(left, right chan int, bufferLen int) {  if bufferLen <= 0 {   left <- 1 + <-right  } else {   for i := 0; i < bufferLen; i++ {    left <- 1 + <-right   }  } }  func main() {  nruntime := 100000  lastChan := make(chan int)   var left chan int = nil  right := lastChan   begin := time.Now()  fmt.Println("begin at:", begin)  for i := 0; i < nruntime; i++ {   left, right = right, make(chan int)   go chanFlow(left, right, 0)  }   right <- 0  result := <-lastChan   end := time.Now()  fmt.Println("end   at:", end, time.Since(begin))  fmt.Println(result) }


      程式建立了10w零1個無緩衝channel, 10w個goruntime, 資料在goruntime中從第一個channel流向最後一個channel,每流入一次數值加一。代碼在我的筆記本(2.7 GHz Intel Core i5, 8 GB 1867 MHz DDR3)運行結果如下:
begin at: 2016-08-28 14:42:04.972728029 +0800 CST
end   at: 2016-08-28 14:42:05.454288408 +0800 CST 481.560725ms
耗時不到半秒。

        上面的例子中使用的是無緩衝的channel,把代碼修改為帶1000個單位緩衝的channel再試試看,代碼如下:


func chanFlow(left, right chan int, bufferLen int) {...} func main() {  nruntime := 100000  chanBuffer := 1000  result := make([]int, 0, 100)   lastChan := make(chan int, chanBuffer)   var left chan int = nil  right := lastChan   begin := time.Now()  fmt.Println("begin at:", begin)  for i := 0; i < nruntime; i++ {   left, right = right, make(chan int, chanBuffer)   go chanFlow(left, right, chanBuffer)  }   for i := 0; i < chanBuffer; i++ {   right <- 0  }   for i := 0; i < chanBuffer; i++ {   result = append(result, <-lastChan)  }   end := time.Now()  fmt.Println("end   at:", end, time.Since(begin))  fmt.Println(result) }


運行結果如下:
begin at: 2016-08-28 14:54:09.352472708 +0800 CST
end   at: 2016-08-28 14:54:14.155240335 +0800 CST 4.802767822s
不到5秒的時間,1000個資料在10w個goruntime中穿過了10w零1個channel。

      而在實際生產中,更多的需要傳遞的資料是字串,那麼現在把代碼再修改一下試試,代碼如下:


package main  import (  "crypto/rand"  "encoding/base64"  "fmt"  "io"  "time" )  func chanFlow(left, right chan string, bufferLen int) {  if bufferLen <= 0 {   left <- <-right  } else {   for i := 0; i < bufferLen; i++ {    left <- <-right   }  } }  func genString() string {  b := make([]byte, 32)  if _, err := io.ReadFull(rand.Reader, b); err != nil {   return ""  } else {   return base64.URLEncoding.EncodeToString(b)  } }  func main() {   nruntime := 100000  chanBuffer := 1000  result := make([]string, 0, 100)   lastChan := make(chan string, chanBuffer)  dataForChan := make([]string, 0, chanBuffer)   for i := 0; i < chanBuffer; i++ {   dataForChan = append(dataForChan, genString())  }   var left chan string = nil  right := lastChan   begin := time.Now()  fmt.Println("begin at:", begin)  for i := 0; i < nruntime; i++ {    left, right = right, make(chan string, chanBuffer)   go chanFlow(left, right, chanBuffer)  }  for i := 0; i < chanBuffer; i++ {   right <- dataForChan[i]  }   for i := 0; i < chanBuffer; i++ {   result = append(result, <-lastChan)  }   end := time.Now()  fmt.Println("end   at:", end, time.Since(begin))  fmt.Println(result) }



運行結果如下:

begin at: 2016-08-28 15:06:25.349599328 +0800 CST
end   at: 2016-08-28 15:06:31.288183546 +0800 CST 5.938584364s
不到6秒的時間,1000個44位元組的隨機字串在10w個goruntime中穿過了10w零1個channel。而1w個44位元組的隨機字串在1w個goruntime中穿過了1w零1個channel耗時約為5秒。

        以上可以看出,golang中資料在goruntime中通過channel同步的效率非常高。

本文來自:CSDN部落格

感謝作者:changjixiong

查看原文:golang-goruntime與channel:高效的channel




查看原文:http://www.zoues.com/2016/10/20/golang-goruntime%e4%b8%8echannel%e9%ab%98%e6%95%88%e7%9a%84channel/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.