学习记录(Go语言高级编程)
并发编程中最常见的例子就是生产者消费者模式,该模式主要通过平衡生产线程和消费线程的工作能力 来提高程序的整体处理数据的速度。简单地说,就是生产者生产一些数据,然后放到成果队列中,同时 消费者从成果队列中来取这些数据。这样就让生产消费变成了异步的两个过程。当成果队列中没有数据 时,消费者就进入饥饿的等待中;而当成果队列中数据已满时,生产者则面临因产品挤压导致CPU被剥 夺的下岗问题。
Go语言实现生产者消费者并发很简单:
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
)
func Producer(factor int, out chan<- int) {
for i := 0; ; i++ {
out <- i * factor
fmt.Printf("chan len %v\n", len(out))
}
}
func Consumer(in <-chan int) {
for v := range in {
fmt.Println(v)
}
}
func main() {
ch := make(chan int)
go Producer(3, ch)
go Producer(5, ch)
go Consumer(ch)
sig := make(chan os.Signal)
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
fmt.Printf("quit (%v)", <-sig)
}
我们开启了2个 Producer 生产流水线,分别用于生成3和5的倍数的序列。然后开启1 个 Consumer 消费者线程,打印获取的结果。
我们可以让 main 函数保存阻塞状态不退出,只有当用户输入 Ctrl-C 时才真正退出程序。