GO语言通用生产消费模型

来源:互联网 发布:淘宝虚假代理 编辑:程序博客网 时间:2024/04/26 06:56

pcmode.go

package pcmodelimport "sync"type callback func(ch chan interface{})type PCModel struct {wg *sync.WaitGroupch chan interface{}ProducerConsumer}type Producer struct {wg    *sync.WaitGroupch    chan interface{}pfunc callback}type Consumer struct {wg    *sync.WaitGroupch    chan interface{}cfunc callback}func NewPCModel(pfunc callback, cfunc callback) *PCModel {model := PCModel{}model.wg = &sync.WaitGroup{}model.ch = make(chan interface{})model.Producer = *NewProducer(model.wg, model.ch, pfunc)model.Consumer = *NewConsumer(model.wg, model.ch, cfunc)return &model}func NewProducer(wg *sync.WaitGroup, ch chan interface{}, f callback) *Producer {p := Producer{}p.wg = wgp.ch = chp.pfunc = freturn &p}func NewConsumer(wg *sync.WaitGroup, ch chan interface{}, f callback) *Consumer {c := Consumer{}c.wg = wgc.ch = chc.cfunc = freturn &c}func (p *Producer) Produce() {p.wg.Add(1)go func(ch chan interface{}) {defer p.wg.Done()p.pfunc(ch)close(ch)}(p.ch)}func (c *Consumer) Consume() {c.wg.Add(1)go func(ch chan interface{}) {defer c.wg.Done()c.cfunc(ch)}(c.ch)}func (pc *PCModel) Wait() {pc.wg.Wait()}

使用方法如下:

package mainimport ("fmt""pcmodel")func ImportData(ch chan interface{}) {for i := 0; i < 10; i++ {ch <- i}}func ExportData(ch chan interface{}) {for data := range ch {fmt.Println(data)}}func main() {pc := pcmodel.NewPCModel(ImportData, ExportData)pc.Produce()pc.Consume()pc.Wait()}