go里面可以实现很多并发模型的优雅解决方案. 总结起来.
package main
import (
"fmt"
"time"
)
var bufChan chan int = make(chan int, 1000)
var msgChan chan int = make(chan int) // 用一个channel来卡主主线程, 否则主线程死了, 所有子线程强制结束了.
// write data to channel
func writer(max int) {
for {
for i := 0; i < max; i++ { // 简单的向channel中放入一个整数
bufChan <- i
time.Sleep(1 * time.Millisecond) //控制放入的频率
}
}
}
// read data fro m channel
func reader(max int) {
for {
r := <-bufChan
fmt.Printf("read value: %d\n", r)
}
// 通知主线程,工作结束了,这一步可以省略
msgChan <- 1
}
func main() {
max := 100
go writer(max)
go reader(max)
// writer 和reader的任务结束了,主线程会得到通知
res := <-msgChan
fmt.Printf("task is done: value=%d\n", res)
}