协程池

golang语言原生的goroutine和channel等机制,对于并发编程提供了很简单的实现。一个go关键字即可生成一个独立的协程。协程的管理需要协程池去实现。

  • 对worker的总协程数量进行限制
  • 限制并发
  • 有任务排队时也不阻塞任务的提交

数据结构

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
type TaskHandler func() error

// WorkPool serves incoming connections via a pool of workers
type WorkPool struct {
	closed       int32
	isQueTask    int32         // Mark whether queue retrieval is task. 标记是否队列取出任务
	errChan      chan error    // error chan
	timeout      time.Duration // max timeout
	wg           sync.WaitGroup
	task         chan TaskHandler
	waitingQueue *myqueue.MyQueue // ringbuffer 可以实现动态扩容
}