From cbf8ddf048f74fcf103f315d591dc45550efa8d4 Mon Sep 17 00:00:00 2001
From: Andy Pan
Date: Sun, 25 Aug 2019 14:25:09 +0800
Subject: [PATCH] Fixed #45 and Releasing v2 module
---
.travis.yml | 1 -
README.md | 16 ++++------------
README_ZH.md | 18 +++---------------
ants_benchmark_test.go | 2 +-
ants_test.go | 2 +-
examples/main.go | 2 +-
go.mod | 3 +++
pool.go | 12 +++++-------
pool_func.go | 8 +++-----
9 files changed, 21 insertions(+), 43 deletions(-)
create mode 100644 go.mod
diff --git a/.travis.yml b/.travis.yml
index 469e02e..a7f3c00 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,7 +1,6 @@
language: go
go:
- - "1.8.x"
- "1.9.x"
- "1.10.x"
- "1.11.x"
diff --git a/README.md b/README.md
index db59cb9..eb9f1ab 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ A goroutine pool for Go
-
+
@@ -53,7 +53,7 @@ import (
"sync/atomic"
"time"
- "github.com/panjf2000/ants"
+ "github.com/panjf2000/ants/v2"
)
var sum int32
@@ -114,7 +114,7 @@ import (
"io/ioutil"
"net/http"
- "github.com/panjf2000/ants"
+ "github.com/panjf2000/ants/v2"
)
type Request struct {
@@ -222,7 +222,7 @@ func WithPanicHandler(panicHandler func(interface{})) Option {
}
```
-`ants.Options`contains all optional configurations of ants pool, which allow you to customize the goroutine pool by invoking option functions to set up each configuration in `NewPool`/`NewPoolWithFunc`method.
+`ants.Options`contains all optional configurations of ants pool, which allows you to customize the goroutine pool by invoking option functions to set up each configuration in `NewPool`/`NewPoolWithFunc`method.
## Customize limited pool
@@ -269,14 +269,6 @@ All tasks submitted to `ants` pool will not be guaranteed to be addressed in ord
## Benchmarks
-```
-OS: macOS High Sierra
-Processor: 2.7 GHz Intel Core i5
-Memory: 8 GB 1867 MHz DDR3
-
-Go Version: 1.9
-```
-
In that benchmark-picture, the first and second benchmarks performed test cases with 1M tasks and the rest of benchmarks performed test cases with 10M tasks, both in unlimited goroutines and `ants` pool, and the capacity of this `ants` goroutine-pool was limited to 50K.
diff --git a/README_ZH.md b/README_ZH.md
index aaf3473..e2f056d 100644
--- a/README_ZH.md
+++ b/README_ZH.md
@@ -9,7 +9,7 @@ A goroutine pool for Go
-
+
@@ -53,7 +53,7 @@ import (
"sync/atomic"
"time"
- "github.com/panjf2000/ants"
+ "github.com/panjf2000/ants/v2"
)
var sum int32
@@ -114,7 +114,7 @@ import (
"io/ioutil"
"net/http"
- "github.com/panjf2000/ants"
+ "github.com/panjf2000/ants/v2"
)
type Request struct {
@@ -269,18 +269,6 @@ pool.Release()
## Benchmarks
-系统参数:
-
-```
-OS: macOS High Sierra
-Processor: 2.7 GHz Intel Core i5
-Memory: 8 GB 1867 MHz DDR3
-
-Go Version: 1.9
-```
-
-
-
上图中的前两个 benchmark 测试结果是基于100w 任务量的条件,剩下的几个是基于 1000w 任务量的测试结果,`ants`的默认池容量是 5w。
diff --git a/ants_benchmark_test.go b/ants_benchmark_test.go
index fa9c423..7076222 100644
--- a/ants_benchmark_test.go
+++ b/ants_benchmark_test.go
@@ -28,7 +28,7 @@ import (
"testing"
"time"
- "github.com/panjf2000/ants"
+ "github.com/panjf2000/ants/v2"
)
const (
diff --git a/ants_test.go b/ants_test.go
index b51df3c..854a20b 100644
--- a/ants_test.go
+++ b/ants_test.go
@@ -29,7 +29,7 @@ import (
"testing"
"time"
- "github.com/panjf2000/ants"
+ "github.com/panjf2000/ants/v2"
)
const (
diff --git a/examples/main.go b/examples/main.go
index f9c73c8..49aba1a 100644
--- a/examples/main.go
+++ b/examples/main.go
@@ -28,7 +28,7 @@ import (
"sync/atomic"
"time"
- "github.com/panjf2000/ants"
+ "github.com/panjf2000/ants/v2"
)
var sum int32
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..201c358
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,3 @@
+module github.com/panjf2000/ants/v2
+
+go 1.12
diff --git a/pool.go b/pool.go
index a6fbe11..03c1ae5 100644
--- a/pool.go
+++ b/pool.go
@@ -196,15 +196,11 @@ func (p *Pool) Cap() int {
}
// Tune changes the capacity of this pool.
-func (p *Pool) Tune(size uint) {
- if p.Cap() == int(size) {
+func (p *Pool) Tune(size int) {
+ if p.Cap() == size {
return
}
atomic.StoreInt32(&p.capacity, int32(size))
- diff := p.Running() - int(size)
- for i := 0; i < diff; i++ {
- p.retrieveWorker().task <- nil
- }
}
// Release Closes this pool.
@@ -292,12 +288,14 @@ func (p *Pool) retrieveWorker() *goWorker {
// revertWorker puts a worker back into free pool, recycling the goroutines.
func (p *Pool) revertWorker(worker *goWorker) bool {
- if atomic.LoadInt32(&p.release) == CLOSED {
+ if atomic.LoadInt32(&p.release) == CLOSED || p.Running() > p.Cap() {
+ worker.task <- nil
return false
}
worker.recycleTime = time.Now()
p.lock.Lock()
p.workers = append(p.workers, worker)
+
// Notify the invoker stuck in 'retrieveWorker()' of there is an available worker in the worker queue.
p.cond.Signal()
p.lock.Unlock()
diff --git a/pool_func.go b/pool_func.go
index 95fce62..7567db3 100644
--- a/pool_func.go
+++ b/pool_func.go
@@ -210,10 +210,6 @@ func (p *PoolWithFunc) Tune(size int) {
return
}
atomic.StoreInt32(&p.capacity, int32(size))
- diff := p.Running() - size
- for i := 0; i < diff; i++ {
- p.retrieveWorker().args <- nil
- }
}
// Release Closed this pool.
@@ -301,12 +297,14 @@ func (p *PoolWithFunc) retrieveWorker() *goWorkerWithFunc {
// revertWorker puts a worker back into free pool, recycling the goroutines.
func (p *PoolWithFunc) revertWorker(worker *goWorkerWithFunc) bool {
- if atomic.LoadInt32(&p.release) == CLOSED {
+ if atomic.LoadInt32(&p.release) == CLOSED || p.Running() > p.Cap() {
+ worker.args <- nil
return false
}
worker.recycleTime = time.Now()
p.lock.Lock()
p.workers = append(p.workers, worker)
+
// Notify the invoker stuck in 'retrieveWorker()' of there is an available worker in the worker queue.
p.cond.Signal()
p.lock.Unlock()