两个goroutine
一个生产数据数据 把生产的数据放入到channel
一个从channle 获取消费数据。
当生产这边生产完毕后,发送一个信号,告知消费方
消费方收到生产方发来的信号,告知生产方ok,不再从管道获取数据
生产方收到回答后,程序结束。
上代码:
package main
import (
"fmt"
"time"
)
func count(c chan int) {
for {
num := <-c
//收到生产发来的信号 数据发送完毕 退出循环
if num == 0 {
break
}
time.Sleep(time.Second)
fmt.Println("num:", num)
}
// 退出循环后 在告知 main 我这边结束了
c <- 0
}
func main() {
ch := make(chan int)
go count(ch)
for i := 1; i <= 10; i++ {
// 向chan 发送数据
ch <- i
}
// 发送0 告知 生产这边数据发送完毕
ch <- 0
// main 收到 count 发来的信号,程序结束
<-ch
}
两个goroutine 能够交替合作,是利用了channel 的特性,通道发送方如果发送了数据,一直没有被接收,goroutine 将阻塞等待。 同样,如果接收方如果一直等不到发送方发送数据,也一直处于等待阻塞状态。