|
|
@@ -25,7 +25,7 @@ func WithWorkPoolLifetime(lifetime time.Duration) WorkPoolOption {
|
|
|
}
|
|
|
|
|
|
type WorkPool struct {
|
|
|
- goChan chan chan func(*time.Timer)
|
|
|
+ goChan TJobPool
|
|
|
size int
|
|
|
lifetime time.Duration
|
|
|
}
|
|
|
@@ -37,31 +37,31 @@ func NewWorkPool(options ...WorkPoolOption) *WorkPool {
|
|
|
opt(wp)
|
|
|
}
|
|
|
|
|
|
- wp.goChan = make(chan chan func(*time.Timer), wp.size)
|
|
|
+ wp.goChan = make(TJobPool, wp.size)
|
|
|
|
|
|
return wp
|
|
|
}
|
|
|
|
|
|
-func (wp *WorkPool) Put(f func(*time.Timer)) {
|
|
|
+func (wp *WorkPool) Put(job *Job) {
|
|
|
for len(wp.goChan) > 0 {
|
|
|
- goRun := <-wp.goChan
|
|
|
- if goRun == nil {
|
|
|
+ jobChan := <-wp.goChan
|
|
|
+ if jobChan == nil {
|
|
|
continue
|
|
|
}
|
|
|
select {
|
|
|
- case <-goRun:
|
|
|
+ case <-jobChan:
|
|
|
default:
|
|
|
- goRun <- f
|
|
|
+ jobChan <- job
|
|
|
return
|
|
|
}
|
|
|
}
|
|
|
- goRun := make(chan func(*time.Timer), 1)
|
|
|
- goRun <- f
|
|
|
- go wp.do(goRun)
|
|
|
+ jobChan := make(TJobChan, 1)
|
|
|
+ jobChan <- job
|
|
|
+ go wp.do(jobChan)
|
|
|
}
|
|
|
|
|
|
// in goroutine
|
|
|
-func (wp *WorkPool) do(one chan func(*time.Timer)) {
|
|
|
+func (wp *WorkPool) do(one TJobChan) {
|
|
|
defer func() {
|
|
|
if e := recover(); e != nil {
|
|
|
}
|
|
|
@@ -73,17 +73,17 @@ func (wp *WorkPool) do(one chan func(*time.Timer)) {
|
|
|
select {
|
|
|
case <-timer.C:
|
|
|
close(one)
|
|
|
- f, ok := <-one
|
|
|
+ job, ok := <-one
|
|
|
if !ok {
|
|
|
return
|
|
|
}
|
|
|
- f(timer)
|
|
|
+ _ = job.Do()
|
|
|
return
|
|
|
- case f, ok := <-one:
|
|
|
+ case job, ok := <-one:
|
|
|
if !ok {
|
|
|
return // one 可能关闭
|
|
|
}
|
|
|
- f(timer)
|
|
|
+ _ = job.Do()
|
|
|
timer.Reset(time.Second * 10)
|
|
|
}
|
|
|
// reuse
|