Go语言goroutine+channel+select简介
goroutine:
Go語言是原生支持語言級并發的,這個并發的最小邏輯單元就是goroutine。goroutine就是Go語言提供的一種用戶態線程,這種用戶態線程是跑在內核級線程之上的,goroutine在運行時的調度是由Go語言提供的調度器來進行的,創建一個goroutine使用關鍵字go,go創建的goroutine不會阻塞主線程:
go func_name()
Go程序中沒有語言級的關鍵字讓你去創建一個內核線程,你只能創建goroutine,內核線程只能由調度器根據實際情況去創建。
調度器原理參考鏈接:http://studygolang.com/articles/1855
?
channel:
Channel是Go中的一個核心類型,可以把它看成一個管道,通過它可以發送或者接收數據進行通訊(communication)。配合goroutine,就形成了一種既簡單又強大的請求處理模型,即N個工作goroutine將處理的中間結果或者最終結果放入一個channel,另外有M個工作goroutine從這個channel拿數據,再進行進一步加工,通過組合這種過程,可以勝任各種復雜的業務模型。
channel的基本操作:
var c chan int???//聲明一個int類型的channel,注意,該語句僅聲明,不初始化channel
c := make(chan type_name)???//創建一個無緩沖的type_name型的channel,無緩沖的channel當放入1個元素后,后續的輸入便會阻塞
c := make(chan type_name, 100)???//創建一個緩沖區大小為100的type_name型的channel
c <- x???//將x發送到channel c中,如果channel緩沖區滿,則阻塞當前goroutine
<- c???//從channel c中接收一個值,如果緩沖區為空,則阻塞
x = <- c???//從channel c中接收一個值并存到x中,如果緩沖區為空,則阻塞
x, ok = <- c???//從channel c中接收一個值,如果channel關閉了,那么ok為false(在沒有defaultselect語句的前提下),在channel未關閉且為空的情況下,仍然阻塞
close(c)???//關閉channel c
for term := range c {}???//等待并取出channelc中的值,直到channel關閉,會阻塞
單向channel:
var ch1 chan<- float64????//只能向里面寫入float64的數據,不能讀取
var ch2 <-chan int????????//只能讀取int型數據
?
select:
select用于在多個channel上同時進行偵聽并收發消息,當任何一個case滿足條件時即執行,如果沒有可執行的case則會執行default的case,如果沒有指定defaultcase,則會阻塞程序,select的語法:
select {
???case communication clause?:
??????statement(s);?????
???case communication clause?:
??????statement(s);
???/*可以定義任意數量的 case */
???default : /*可選 */
??????statement(s);
}
說明:
否則: 1.如果有default子句,則執行該語句。
如果沒有default字句,select將阻塞,直到某個通信可以運行;Go不會重新對channel或值進行求值。
?
demo:
package main
?
import (
"fmt"
???"time"
)
?
func enqueue(q chan int) {
???time.Sleep(time.Second * 3)
??? q <- 10
??? close(q)
}
?
func main() {
??? var c =make(chan int)
??? go enqueue(c)
??? for {
??????? select {
??????????? casex, ok := <- c:
???????????????if ok {
???????????????????fmt.Println(x)
???????????????} else {
???????????????????fmt.Println("closed")
???????????????????return
???????????????}
???????????default:
???????????????fmt.Println("waiting")
???????????????time.Sleep(time.Second)
??????? }
??? }
}
?
關于合理使用goroutine,推薦一篇文章:http://www.cnblogs.com/yjf512/archive/2012/06/30/2571247.html
總結
以上是生活随笔為你收集整理的Go语言goroutine+channel+select简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编译原理 总结
- 下一篇: golang基础-chan的select