15-golang併發中channel的使用
阿新 • • 發佈:2018-11-07
我們先寫一段程式碼
func main() { go person1() go person2() for { } } func Printer(str string) { for _, ch := range str { fmt.Printf("%c", ch) time.Sleep(time.Second) } fmt.Println() } func person1() { Printer("hello") } func person2() { Printer("world") }
這段程式碼很簡單,就是模擬兩個人使用1個印表機
那麼現在是併發狀態使用印表機
結果我們會發現
出現了whoerlllod這樣併發列印的效果
然後我們需要想一個辦法
使得我們的person1和person2有一個同步的狀態
就是person1列印完成了再列印person2
這時候我們就需要使用到channel了
我們要定義一個成員變數
var channel = make(chan int) func main() { go person1() go person2() for { } } func Printer(str string) { for _, ch := range str { fmt.Printf("%c", ch) time.Sleep(time.Second) } fmt.Println() } func person1() { Printer("hello") channel <- 1 } func person2() { <-channel Printer("world") }
這裡的<-channel意思是
在channel收到資料之前,這裡就是阻塞的
channel<- 1實際上就是發了一個1這個資訊
這樣person2中就收到了一個1
那麼這裡的子協程就不阻塞了,就可以進行列印了
所以channel就是通過傳遞資訊這樣的方式
來實現同步
當然資料也可以支援其他的格式
比如string
var channel = make(chan string) func main() { go person1() go person2() for { } } func Printer(str string) { for _, ch := range str { fmt.Printf("%c", ch) time.Sleep(time.Second) } fmt.Println() } func person1() { Printer("hello") channel <- "ok" } func person2() { <-channel Printer("world") }