go語言中的channel

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。channel是go語言中的同步工具,有兩種模式
  • 緩衝
  • 程式執行序列將阻塞在讀channel的調用處 <- chan; 或當channel滿時,阻塞在寫channel調用處 chan <-。
    引用 Sends to a buffered channel block only when the buffer is full. Receives block when the buffer is empty.
  • 非緩衝
  • 程式執行序列將阻塞在讀和寫channel的調用處 chan <- 或 <- chan
    引用 sends and receives block until the other side is ready.
1. 先來看看緩衝方式
package mainvar a stringvar c = make(chan int, 10)func f() {  a = "hello world"  c <- 0  //<- c}func main() {  go f()  <- c  //c <- 0  print(a)}

執行結果:
hello word

此時,goroutines f() 先給a賦值,再向channel c中寫入0;goroutines main() 阻塞在 <- c處,直到 f() 中 向管道中c中寫資料語句: c <- 0 執行。

如果將兩處管道操作調換順序,執行結果為空白。因為,main()將不阻塞直接print a,此時f()中a = "hello world"語句可能未執行,所以不一定能有hello world輸出。

2. 再看看非緩衝方式的管道
package mainvar a stringvar c = make(chan int)func f() {  a = "hello world"  //c <- 0  <- c}func main() {  go f()  //<- c  c <- 0  print(a)}

執行結果:
hello world

此時,goroutines main()阻塞在寫c <- 0語句處;goroutines f() 先給a賦值,再讀管道c。當讀c執行後,main()執行其後的語句,此時 a 是被賦值的。
註:其實讀寫管道都將可能被阻塞,直到有一方的讀或寫完成
此時,將兩處管道操作調換順序,同樣也能夠保證執行順序

go語言的channel是一個重要的同步工具,正確的使用能大大減少同步帶來的麻煩
相關文章

聯繫我們

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