1. 程式人生 > >15-golang併發中channel的使用

15-golang併發中channel的使用

 

 

我們先寫一段程式碼

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")
}