| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- package utl
- import (
- "time"
- // "go.uber.org/zap"
- )
- type WorkPool struct {
- goChan chan chan func(*time.Timer)
- size int
- }
- func NewWorkPool(size int) *WorkPool {
- return &WorkPool{
- goChan: make(chan chan func(*time.Timer), size),
- size: size,
- }
- }
- func (wp *WorkPool) Put(f func(*time.Timer)) {
- for len(wp.goChan) > 0 {
- goRun := <-wp.goChan
- if goRun == nil {
- continue
- }
- select {
- case <-goRun:
- default:
- goRun <- f
- return
- }
- }
- goRun := make(chan func(*time.Timer), 1)
- goRun <- f
- go wp.do(goRun)
- }
- // in goroutine
- func (wp *WorkPool) do(one chan func(*time.Timer)) {
- defer func() {
- if e := recover(); e != nil {
- }
- }()
- timer := time.NewTimer(time.Second * 1)
- defer timer.Stop()
- for {
- select {
- case <-timer.C:
- close(one)
- f, ok := <-one
- if !ok {
- return
- }
- f(timer)
- return
- case f, ok := <-one:
- if !ok {
- return // one 可能关闭
- }
- f(timer)
- timer.Reset(time.Second * 10)
- }
- if len(wp.goChan) < wp.size {
- wp.goChan <- one
- }
- }
- }
|