目錄: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()
單向通道
單向通道只能傳送或者接受資料示例:
可以新增ok來判斷是否有從通道取到值// sendch通道 只能寫入
func
senddata
(sendch chan
<-
int)
func
main()
// 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,它是乙個結構體,可以用於等待執行緒執行 這樣不用去估算執行緒需要執...