channel实现生产者、消费者模型

const (
	READ_TO_DISPATCH = "a"   //派遣任务
	READ_TO_EXECUTE  = "e"   //处理任务
	CLOSE            = "c"   //退出
)

type SignChan chan string

type DataChan chan interface{}

type  fn func(da DataChan) error


type Runner struct {
	signChan SignChan
	dataChan DataChan
	dataSize int
	longLive bool
	Dispathch fn
	execute   fn
	err      SignChan
}

func (r *Runner)StartDispatch(){
	if !r.longLive {
		close(r.err)
		close(r.dataChan)
		close(r.signChan)
	}
	Loop:
		//生产者 消费者模型
	for {
		select {
		case sign := <-r.signChan:
			//第一次执行需要预支一个通知生产者的任务
			//往后是在消费者执行完任务以后再给生产者发送消息
			if sign == READ_TO_DISPATCH{
				err := r.Dispathch(r.dataChan)
				if err != nil {
					r.err <- CLOSE
				}else {
					r.signChan <- READ_TO_EXECUTE
				}
			}
			//生产者通知消费者开始执行任务
			if sign == READ_TO_EXECUTE{
				err := r.execute(r.dataChan)
				if err != nil {
					r.err <- CLOSE
				}else {
					r.signChan <- READ_TO_DISPATCH
				}

			}

		case err := <-r.err:
			if err == CLOSE{
				return
			}
		default:
			break Loop
		}
	}
}

func (r *Runner)StartAll(){
      //预支任务 r.signChan <- READ_TO_DISPATCH go r.StartDispatch() }

  

posted on 2020-04-16 15:59  thotf  阅读(317)  评论(0)    收藏  举报

导航