共享變量
協(xié)程之間的通信只能夠通過通道。但是我們習(xí)慣于共享變量,而且很多時候使用共享變量能讓代碼更簡潔。比如一個Server有兩個狀態(tài)開和關(guān)。其他僅僅希望獲取或改變其狀態(tài),那又該如何做呢?梢詫⑦@個變量至于0通道中,并使用一個協(xié)程來維護。
下面的例子描述如何用這個方式,實現(xiàn)一個共享變量。
//共享變量有一個讀通道和一個寫通道組成
typesharded_var struct {
reader chan int
writer chan int
}
//共享變量維護協(xié)程
funcsharded_var_whachdog(v sharded_var) {
go func() {
//初始值
var value int = 0
for {
//監(jiān)聽讀寫通道,完成服務(wù)
select {
case value =<-v.writer:
case v.reader <-value:
}
}
}()
}
funcmain() {
//初始化,并開始維護協(xié)程
v := sharded_var{make(chan int),make(chan int)}
sharded_var_whachdog(v)
//讀取初始值
fmt.Println(<-v.reader)
//寫入一個值
v.writer <- 1
//讀取新寫入的值
fmt.Println(<-v.reader)
}
這樣,就可以在協(xié)程和通道的基礎(chǔ)上實現(xiàn)一個協(xié)程安全的共享變量了。定義一個寫通道,需要更新變量的時候,往里寫新的值。再定義一個讀通道,需要讀的時候,從里面讀。通過一個單獨的協(xié)程來維護這兩個通道。保證數(shù)據(jù)的一致性。
一般來說,協(xié)程之間不推薦使用共享變量來交互,但是按照這個辦法,在一些場合,使用共享變量也是可取的。很多平臺上有較為原生的共享變量支持,到底用那種 實現(xiàn)比較好,就見仁見智了。另外利用協(xié)程和通道,可以還實現(xiàn)各種常見的并發(fā)數(shù)據(jù)結(jié)構(gòu),如鎖等等,就不一一贅述。