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