mirror of https://github.com/panjf2000/ants.git
optimization for clearing expired workers and gofmt codes
This commit is contained in:
commit
267107d0fb
14
README.md
14
README.md
|
@ -37,7 +37,6 @@ glide get github.com/panjf2000/ants
|
|||
If your program will generate a massive number of goroutines and you don't want them to consume a vast amount of memory, with ants, all you need to do is to import ants package and submit all your tasks to the default limited pool created when ants was imported:
|
||||
|
||||
``` go
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -84,8 +83,8 @@ func main() {
|
|||
fmt.Printf("finish all tasks.\n")
|
||||
|
||||
// use the pool with a function
|
||||
// set 10 the size of goroutine pool
|
||||
p, _ := ants.NewPoolWithFunc(10, func(i interface{}) error {
|
||||
// set 10 the size of goroutine pool and 1 second for expired duration
|
||||
p, _ := ants.NewPoolWithFunc(10, 1, func(i interface{}) error {
|
||||
myFunc(i)
|
||||
wg.Done()
|
||||
return nil
|
||||
|
@ -132,6 +131,15 @@ Don't worry about the synchronous problems in this case, this method is thread-s
|
|||
All the tasks submitted to ants pool will not be guaranteed to be processed in order, because those tasks distribute among a series of concurrent workers, thus those tasks are processed concurrently.
|
||||
|
||||
## Benchmarks
|
||||
|
||||
```
|
||||
OS : macOS High Sierra
|
||||
Processor : 2.7 GHz Intel Core i5
|
||||
Memory : 8 GB 1867 MHz DDR3
|
||||
|
||||
Go1.9
|
||||
```
|
||||
|
||||
<div align="center"><img src="ants_benchmarks.png"/></div>
|
||||
|
||||
In that benchmark-picture, the first and second benchmarks performed test with 100w tasks and the rest of benchmarks performed test with 1000w tasks, both unlimited goroutines and ants pool, and the capacity of this ants goroutine-pool was limited to 5w.
|
||||
|
|
|
@ -38,7 +38,6 @@ glide get github.com/panjf2000/ants
|
|||
写 go 并发程序的时候如果程序会启动大量的 goroutine ,势必会消耗大量的系统资源(内存,CPU),通过使用 `ants`,可以实例化一个协程池,复用 goroutine ,节省资源,提升性能:
|
||||
|
||||
``` go
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
|
@ -85,8 +84,8 @@ func main() {
|
|||
fmt.Printf("finish all tasks.\n")
|
||||
|
||||
// use the pool with a function
|
||||
// set 10 the size of goroutine pool
|
||||
p, _ := ants.NewPoolWithFunc(10, func(i interface{}) error {
|
||||
// set 10 the size of goroutine pool and 1 second for expired duration
|
||||
p, _ := ants.NewPoolWithFunc(10, 1, func(i interface{}) error {
|
||||
myFunc(i)
|
||||
wg.Done()
|
||||
return nil
|
||||
|
@ -137,6 +136,8 @@ pool.ReSize(100000) // Readjust its capacity to 100000
|
|||
OS : macOS High Sierra
|
||||
Processor : 2.7 GHz Intel Core i5
|
||||
Memory : 8 GB 1867 MHz DDR3
|
||||
|
||||
Go1.9
|
||||
```
|
||||
|
||||
|
||||
|
|
1
ants.go
1
ants.go
|
@ -68,4 +68,3 @@ var (
|
|||
ErrPoolSizeInvalid = errors.New("invalid size for pool")
|
||||
ErrPoolClosed = errors.New("this pool has been closed")
|
||||
)
|
||||
|
||||
|
|
|
@ -78,7 +78,7 @@ func BenchmarkGoroutineWithFunc(b *testing.B) {
|
|||
|
||||
func BenchmarkAntsPoolWithFunc(b *testing.B) {
|
||||
var wg sync.WaitGroup
|
||||
p, _ := ants.NewPoolWithFunc(50000, 1,func(i interface{}) error {
|
||||
p, _ := ants.NewPoolWithFunc(50000, 1, func(i interface{}) error {
|
||||
demoPoolFunc(i)
|
||||
wg.Done()
|
||||
return nil
|
||||
|
|
|
@ -66,7 +66,7 @@ func main() {
|
|||
fmt.Printf("finish all tasks.\n")
|
||||
|
||||
// use the pool with a function
|
||||
// set 10 the size of goroutine pool
|
||||
// set 10 the size of goroutine pool and 1 second for expired duration
|
||||
p, _ := ants.NewPoolWithFunc(10, 1, func(i interface{}) error {
|
||||
myFunc(i)
|
||||
wg.Done()
|
||||
|
|
6
pool.go
6
pool.go
|
@ -76,9 +76,10 @@ func (p *Pool) monitorAndClear() {
|
|||
n = i
|
||||
w.stop()
|
||||
idleWorkers[i] = nil
|
||||
p.running--
|
||||
}
|
||||
if n > 0 {
|
||||
n += 1
|
||||
n++
|
||||
p.workers = idleWorkers[n:]
|
||||
}
|
||||
p.lock.Unlock()
|
||||
|
@ -86,7 +87,6 @@ func (p *Pool) monitorAndClear() {
|
|||
}()
|
||||
}
|
||||
|
||||
|
||||
// NewPool generates a instance of ants pool
|
||||
func NewPool(size, expiry int) (*Pool, error) {
|
||||
if size <= 0 {
|
||||
|
@ -137,7 +137,7 @@ func (p *Pool) Release() error {
|
|||
for i := 0; i < running; i++ {
|
||||
p.getWorker().stop()
|
||||
}
|
||||
for i := range p.workers{
|
||||
for i := range p.workers {
|
||||
p.workers[i] = nil
|
||||
}
|
||||
})
|
||||
|
|
|
@ -77,6 +77,7 @@ func (p *PoolWithFunc) MonitorAndClear() {
|
|||
n = i
|
||||
w.stop()
|
||||
idleWorkers[i] = nil
|
||||
p.running--
|
||||
}
|
||||
if n > 0 {
|
||||
n += 1
|
||||
|
@ -141,7 +142,7 @@ func (p *PoolWithFunc) Release() error {
|
|||
for i := 0; i < running; i++ {
|
||||
p.getWorker().stop()
|
||||
}
|
||||
for i := range p.workers{
|
||||
for i := range p.workers {
|
||||
p.workers[i] = nil
|
||||
}
|
||||
})
|
||||
|
|
Loading…
Reference in New Issue