GO语言通用生产消费模型

pcmode.go

package pcmodel

import "sync"

type callback func(ch chan interface{})

type PCModel struct {
	wg *sync.WaitGroup
	ch chan interface{}
	Producer
	Consumer
}

type Producer struct {
	wg    *sync.WaitGroup
	ch    chan interface{}
	pfunc callback
}

type Consumer struct {
	wg    *sync.WaitGroup
	ch    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 = wg
	p.ch = ch
	p.pfunc = f
	return &p
}

func NewConsumer(wg *sync.WaitGroup, ch chan interface{}, f callback) *Consumer {
	c := Consumer{}
	c.wg = wg
	c.ch = ch
	c.cfunc = f
	return &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 main

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值