日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Go通道channel通過通信共享內(nèi)存_Golang

作者:LiberHome ? 更新時間: 2022-08-28 編程語言

引言

不要通過共享內(nèi)存來通信 應(yīng)該通過通信來共享內(nèi)存

這句話有網(wǎng)友的解釋如下:

這句俏皮話具體說來就是,不同的線程不共享內(nèi)存不用鎖,線程之間通訊用通道(channel)同步也用channel。

chanel是協(xié)程之間傳遞信息的媒介,優(yōu)雅地解決了某些后端開發(fā)常用語言中隨處可見的lock,unlock,臨界區(qū)等,把從很多線程層面解決的問題移到協(xié)程,從而靜態(tài)地保證沒有數(shù)據(jù)競爭。

通道的聲明與創(chuàng)建

偽代碼如下:

//聲明類型
var 通道名 chan 數(shù)據(jù)類型
//創(chuàng)建通道
通道名 = make(chan 數(shù)據(jù)類型)

實際例子如下:

package main
import "fmt"
func main() {
    var a chan int
    fmt.Printf("%T, %v\n", a, a)
    if a == nil {
        a = make(chan int)
        fmt.Printf("%T, %v\n", a, a)
    }
}

運行結(jié)果是:

chan int, <nil>
chan int, 0x1400001a360

通道是一個內(nèi)存地址,這也說明了其實一個引用類型的數(shù)據(jù)。

接收 & 發(fā)送數(shù)據(jù)

對于同一個通道來講,他的讀數(shù)據(jù) 和 寫數(shù)據(jù) 都是阻塞的。
偽代碼如下:

//從通道讀數(shù)據(jù)
data := <-a
//把數(shù)據(jù)寫入通道
a <- data

實際例子如下:

package main
import "fmt"
func main() {
    //    首先創(chuàng)建一個bool類型的通道
    var ch1 chan bool
    ch1 = make(chan bool)
    //下面啟動一個go routine
    go func() {
        for i := 0; i &lt; 10; i++ {
            fmt.Println("子goroutine中, i: ", i)
        }
        fmt.Println("completed")
        //循環(huán)結(jié)束后 向團(tuán)隊中寫數(shù)據(jù),表示要結(jié)束了
        ch1 &lt;- true
    }()
    //在主程序中讀取數(shù)據(jù)
    data := &lt;-ch1
    //打印一下 我們讀到的數(shù)據(jù)
    fmt.Println("main  data: ", data)
    fmt.Println("main goroutine completed")
}

運行結(jié)果如下:

子goroutine中, i: 0
子goroutine中, i: 1
子goroutine中, i: 2
子goroutine中, i: 3
子goroutine中, i: 4
子goroutine中, i: 5
子goroutine中, i: 6
子goroutine中, i: 7
子goroutine中, i: 8
子goroutine中, i: 9
completed
main data: true
main goroutine completed

我們的子goroutine里面 循環(huán)打印1~10, 打印完成之后 把chanel類型的ch1寫為true,
這時候,主goroutine就可以根據(jù)這一條件進(jìn)行下一步了,,在此之前,其實就算主goroutine先搶到了資源,從ch1中讀取數(shù)據(jù),但是現(xiàn)在通道里面啥都沒有,只能阻塞,然后乖乖交出資源給我們的子goroutine,直到循環(huán)結(jié)束寫true入ch1。

需要注意的有以下幾點:

  • chanel是需要指定類型的 nil類型的chanel不能直接使用。
  • chanel本身是同步的,同一時間只能有一條goroutine進(jìn)行操作。
  • chanel是goroutine之間傳遞數(shù)據(jù)用的,chanel數(shù)據(jù)的發(fā)送和接收必須在不同的goroutine中,如果只有一條goroutine是用不上chanel的,這種情況會發(fā)生死鎖(deadLock)。
  • 從chanel里面讀數(shù)據(jù)立馬就會被阻塞,直到有向chanel寫數(shù)據(jù)的goroutine來。
  • 向chanel里面寫數(shù)據(jù)立馬就會被阻塞,直到有從chanel讀數(shù)據(jù)的goroutine來。

(以上都是相對于沒有緩存的通道而言,后面講到的緩存通道在緩沖區(qū)滿的時候才阻塞,而不是立刻阻塞)

原文鏈接:https://segmentfault.com/a/1190000041888050

欄目分類
最近更新