Go 協程 通道

2021-09-29 13:32:31 字數 2690 閱讀 7195

目錄:go 協程

go 通道

go 協程

go 協程可以看作是輕量級執行緒。與執行緒相比,建立乙個go協程的成本很小。因此在go應用中,常常會看到有數以千計的go協程併發地執行

go 協程相比於執行緒的優勢

啟動乙個go協程

在呼叫函式和方法時,在前面加上關鍵字go,可以讓乙個新的go協程併發執行

package main

import

"fmt"

func

test()

func

main()

此時只輸出了「開始」

for迴圈

func

test()

func

main()

// 睡1s來等待協程結束

time.

sleep

(time.second*1)

}

回到目錄

go 通道

通道可以想象成go協程之間通訊的管道。如同管道中的水會從一段流到另一端,通過使用通道,資料也可以從一段傳送,在另一端接收。

通道的宣告

var a chan

bool

=make

(chan

bool

)var a =

make

(chan

bool

)a :=

make

(chan

bool

)

通道傳送和接收資料使用如下語法

// 讀取通道a

data :=

<-a

// 寫入通道a

a <- data

示例:

func

test

(a chan

bool

)func

main()

通道的傳送和接收預設是阻塞的

更好地理解阻塞

示例:

func

hello

(done chan

bool

)func

main()

執行效果是:

「main going to call hello go goroutine」

「hello go routine is going to sleep」

睡4s「hello go routine awake and going to write to done」

「main received data」

使用執行緒來實現 計算乙個數的每一位的平方和與立方和相加的結果

示例:

func

calcsquares

(number int

, squareop chan

int)

squareop <- sum

}func

calccubes

(number int

, cubeop chan

int)

cubeop <- sum

}func

main()

回到目錄

死鎖

使用通道需要考慮下死鎖問題。當go協程給乙個通道傳送資料時,照理說會有別的協程來接受資料,如果沒有的話,程式就會觸發panic(相當於python異常),形成死鎖。

示例:

func

main()

單向通道

單向通道只能傳送或者接受資料

示例:

// sendch通道 只能寫入

func

senddata

(sendch chan

<-

int)

func

main()

可以新增ok來判斷是否有從通道取到值

// sendch通道 只能寫入

func

senddata

(sendch chan

<-

int)

func

main()

}

通道關閉和使用for range遍歷通道

func

producer

(chnl chan

int)

close

(chnl)

}func

main()

fmt.

println

("received "

, v, ok)

}}

回到目錄

Go協程通道鎖故事化理解

老大交給小兵任務,從倉庫運大公尺到老大家,小兵就去倉庫取到大公尺,找到大公尺之後,運到老大家,如果不運到老大家的話,就會一直扛著,身體受不了,就會dead lock.必須有老大家進行接收。老大 主程式 小兵 channel 協程 倉庫進行分發大公尺的程式 小兵收到大公尺 讀取或寫入channel 運...

go語言中有關通道與協程

1.有無緩衝的通道是否同步 ch make chan int 無緩衝的channel由於沒有緩衝傳送和接收需要同步.ch make chan int,2 有緩衝channel不要求傳送和接收操作同步.channel無緩衝時,傳送阻塞直到資料被接收,接收阻塞直到讀到資料。channel有緩衝時,當緩衝...

go 協程等待

sync包提供了基本的同步基元,如互斥鎖 但是這裡不是討論執行緒通訊的問題 而執行緒通訊應使用channel 以前使用time.sleep 來保證執行緒執行完成,顯然執行緒執行所需要的時間不確定 sync裡面有乙個waitgroup,它是乙個結構體,可以用於等待執行緒執行 這樣不用去估算執行緒需要執...