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