golang 协程池的实现

之前在工作中,有使用到协程池,特在此记录下

逻辑分析

要实现协程池,首先要明确协程池的必要条件

工作对象

Task,即原子工作任务,任务池及工作池以

并发数

maxWorkerNum 自定义性的并发控制

任务池

EntryChan 实现任务输入队列

工作池

WorkerChan 实现任务分发队列

上下文管理器

Context 实现协程池的中断控制

代码实现

type Task struct {
	Params   map[string]interface{}
	CallBack func(map[string]interface{})
}

// Pool 协程池 无缓冲,任务推送完成后需主动关闭Entry
type Pool struct {
	maxWorkerNum int
	WorkerChan   chan *Task
	EntryChan    chan *Task
	Context      context.Context
}

func NewGoPool(ctx context.Context, maxWorkerNum int) *Pool {
	return &Pool{
		Context:      ctx,
		maxWorkerNum: maxWorkerNum,
		WorkerChan:   make(chan *Task),
		EntryChan:    make(chan *Task),
	}
}

func (p Pool) work(ctx context.Context) {
	defer func() {
		if _, ok := <- p.WorkerChan; ok {
			close(p.WorkerChan)
		}
	}()
	for {
		select {
		case <-ctx.Done():
			return
		case task := <-p.WorkerChan:
			if task == nil {
				continue
			}
			task.CallBack(task.Params)
		}
	}
}

func (p Pool) Run() {

	for i := 0; i < p.maxWorkerNum; i++ {
		go p.work(p.Context)
	}

	for task := range p.EntryChan {
		p.WorkerChan <- task
	}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值