国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

go 并發(fā)編程

asal 2016-11-07 16:40:36 634
abstrak:channel  go語言提供的消息通信機制被稱為channel.  "不要通過共享內(nèi)存來通信,而應該通過通信來共享內(nèi)存".  channel是go語言在語言級別提供的goroutine之間的通信方式.是類型相關的,一個channel只能傳遞一種類型的值.這個類型需要在聲明channel的時候指定.  在對應的channel被讀取前,這個操作時阻塞的,在所有的goroutine

channel

  go語言提供的消息通信機制被稱為channel.

  "不要通過共享內(nèi)存來通信,而應該通過通信來共享內(nèi)存".

  channel是go語言在語言級別提供的goroutine之間的通信方式.是類型相關的,一個channel只能傳遞一種類型的值.這個類型需要在聲明channel的時候指定.

  在對應的channel被讀取前,這個操作時阻塞的,在所有的goroutine啟動完成后,我們通過<-ch語句從10個channel中依次讀取數(shù)據(jù),在對應的channel寫入數(shù)據(jù)前,這個操作也是阻塞的.這樣我們就用channel實現(xiàn)了類似鎖的功能,進而保證了所有的goroutine完成后主函數(shù)才能返回.

 go demo

package main

import (
"fmt"
"runtime"
)

 

func Count(ch chan int, i int) {
fmt.Println("counting", i)
ch <- i
fmt.Println("after chan", i)
}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
chs := make([]chan int, 10)
for i := 0; i < 10; i++ {
chs[i] = make(chan int)
go Count(chs[i], i)
}
fmt.Println("start for")
for _, ch := range chs {
var ii int
ii = <-ch
fmt.Println("for ", ii)
}
}

select

go語言直接在語言級別支持select關鍵字,用于處理異步IO問題.

select 用法與switch類似,最大的一條限制是每個case語句必須是一個IO操作,case后都必須是chan操作

select{

    case <-chan1:

    // 如果成功從chan1成功數(shù)據(jù)

    case chan2<-1:

    // 如果成功向chan2寫入數(shù)據(jù)

    default:

    //如果都沒成功

}

  // 隨機寫入 0,1

ch := make(chan int, 1)
for a := 0; a < 10; a++ {
select {
case ch <- 0:
case ch <- 1:
}
i := <-ch
fmt.Println(i)

緩沖機制

  使用于需要持續(xù)傳輸大量數(shù)據(jù)的場景, c := make(chan int ,1024),即使沒有讀取方,寫入方也可以一直往channel里寫入,在緩沖區(qū)填完之前不會被阻塞.

  從緩沖區(qū)讀取數(shù)據(jù)與常規(guī)非緩沖channel完全一致,我們也可以使用range關鍵字來實現(xiàn)循環(huán)讀取

超時機制

  在往channel寫入數(shù)據(jù)時發(fā)現(xiàn)已滿,或讀取數(shù)據(jù)時發(fā)現(xiàn)為空,如果不正確處理這些數(shù)據(jù),很可能導致整個goroutine死鎖.

  可以結合select 進行超時處理.

channel  包括 雙向channel,單項channel(只讀channel,只寫channel)

關閉channel

  close(ch);判斷關閉 x,ok := <-ch  只需要判斷第二個bool返回值即可.false則表示關閉. 


Nota Keluaran

Penyertaan Popular