diff --git a/README.md b/README.md index e93ddce..b978649 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ Package ants implements a fixed goroutine pool for managing and recycling a mass - Automatically managing and recycling a massive number of goroutines. - Periodically clearing overdue goroutines. -- Friendly interfaces: submitting tasks, getting the number of running goroutines, readjusting capacity of pool dynamically, closing pool. +- Friendly interfaces: submitting tasks, getting the number of running goroutines, readjusting capacity of pool dynamically, closing pool. - Efficient in memory usage and it even achieves higher performance than unlimited goroutines in golang. @@ -182,9 +182,9 @@ There was only the test of `ants` Pool because my computer was crash when it rea **As you can see, `ants` can up to 2x~6x faster than goroutines without pool and the memory consumption is reduced by 10 to 20 times.** -[1]: https://travis-ci.com/panjf2000/ants.svg?branch=develop +[1]: https://travis-ci.com/panjf2000/ants.svg?branch=master [2]: https://travis-ci.com/panjf2000/ants -[3]: https://codecov.io/gh/panjf2000/ants/branch/develop/graph/badge.svg +[3]: https://codecov.io/gh/panjf2000/ants/branch/master/graph/badge.svg [4]: https://codecov.io/gh/panjf2000/ants [5]: https://goreportcard.com/badge/github.com/panjf2000/ants [6]: https://goreportcard.com/report/github.com/panjf2000/ants diff --git a/README_ZH.md b/README_ZH.md index 1ba7098..e06c36e 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -180,9 +180,9 @@ Go1.9 **从该demo测试吞吐性能对比可以看出,使用ants的吞吐性能相较于原生goroutine可以保持在2-6倍的性能压制,而内存消耗则可以达到10-20倍的节省优势。** -[1]: https://travis-ci.com/panjf2000/ants.svg?branch=develop +[1]: https://travis-ci.com/panjf2000/ants.svg?branch=master [2]: https://travis-ci.com/panjf2000/ants -[3]: https://codecov.io/gh/panjf2000/ants/branch/develop/graph/badge.svg +[3]: https://codecov.io/gh/panjf2000/ants/branch/master/graph/badge.svg [4]: https://codecov.io/gh/panjf2000/ants [5]: https://goreportcard.com/badge/github.com/panjf2000/ants [6]: https://goreportcard.com/report/github.com/panjf2000/ants diff --git a/ants_test.go b/ants_test.go index 80cf140..f61efe5 100644 --- a/ants_test.go +++ b/ants_test.go @@ -26,9 +26,9 @@ import ( "runtime" "sync" "testing" + "time" "github.com/panjf2000/ants" - "time" ) var n = 100000 diff --git a/pool.go b/pool.go index aec9573..ac3edcd 100644 --- a/pool.go +++ b/pool.go @@ -129,6 +129,16 @@ func (p *Pool) Running() int { return int(atomic.LoadInt32(&p.running)) } +// IncrRunning increases the number of the currently running goroutines +func (p *Pool) IncrRunning() { + atomic.AddInt32(&p.running, 1) +} + +// DecrRunning decreases the number of the currently running goroutines +func (p *Pool) DecrRunning() { + atomic.AddInt32(&p.running, -1) +} + // Free returns the available goroutines to work func (p *Pool) Free() int { return int(atomic.LoadInt32(&p.capacity) - atomic.LoadInt32(&p.running)) @@ -181,11 +191,7 @@ func (p *Pool) getWorker() *Worker { idleWorkers := p.workers n := len(idleWorkers) - 1 if n < 0 { - if p.Running() >= p.Cap() { - waiting = true - } else { - atomic.AddInt32(&p.running, 1) - } + waiting = p.Running() >= p.Cap() } else { <-p.freeSignal w = idleWorkers[n] @@ -209,6 +215,7 @@ func (p *Pool) getWorker() *Worker { task: make(chan f, 1), } w.run() + p.IncrRunning() } return w } diff --git a/pool_func.go b/pool_func.go index c3f20a7..77221e4 100644 --- a/pool_func.go +++ b/pool_func.go @@ -134,6 +134,16 @@ func (p *PoolWithFunc) Running() int { return int(atomic.LoadInt32(&p.running)) } +// IncrRunning increases the number of the currently running goroutines +func (p *PoolWithFunc) IncrRunning() { + atomic.AddInt32(&p.running, 1) +} + +// DecrRunning decreases the number of the currently running goroutines +func (p *PoolWithFunc) DecrRunning() { + atomic.AddInt32(&p.running, -1) +} + // Free returns the available goroutines to work func (p *PoolWithFunc) Free() int { return int(atomic.LoadInt32(&p.capacity) - atomic.LoadInt32(&p.running)) @@ -186,11 +196,7 @@ func (p *PoolWithFunc) getWorker() *WorkerWithFunc { idleWorkers := p.workers n := len(idleWorkers) - 1 if n < 0 { - if p.Running() >= p.Cap() { - waiting = true - } else { - atomic.AddInt32(&p.running, 1) - } + waiting = p.Running() >= p.Cap() } else { <-p.freeSignal w = idleWorkers[n] @@ -214,6 +220,7 @@ func (p *PoolWithFunc) getWorker() *WorkerWithFunc { args: make(chan interface{}, 1), } w.run() + p.IncrRunning() } return w } diff --git a/worker.go b/worker.go index c0667fb..8d29a3a 100644 --- a/worker.go +++ b/worker.go @@ -23,7 +23,6 @@ package ants import ( - "sync/atomic" "time" ) @@ -47,7 +46,7 @@ func (w *Worker) run() { go func() { for f := range w.task { if f == nil { - atomic.AddInt32(&w.pool.running, -1) + w.pool.DecrRunning() return } f() diff --git a/worker_func.go b/worker_func.go index 86c7448..22b6069 100644 --- a/worker_func.go +++ b/worker_func.go @@ -23,7 +23,6 @@ package ants import ( - "sync/atomic" "time" ) @@ -47,7 +46,7 @@ func (w *WorkerWithFunc) run() { go func() { for args := range w.args { if args == nil { - atomic.AddInt32(&w.pool.running, -1) + w.pool.DecrRunning() return } w.pool.poolFunc(args)