mirror of
https://github.com/panjf2000/ants.git
synced 2025-12-16 18:11:03 +00:00
解决竞争锁导致bug
This commit is contained in:
parent
912aa76987
commit
1846b4392a
@ -42,9 +42,9 @@ const (
|
||||
YiB // 1208925819614629174706176
|
||||
)
|
||||
const (
|
||||
RunTimes = 10000000
|
||||
RunTimes = 1000000
|
||||
Param = 100
|
||||
AntsSize = 1000
|
||||
AntsSize = 50000
|
||||
TestSize = 10000
|
||||
)
|
||||
|
||||
@ -68,6 +68,7 @@ func demoPoolFunc(args interface{}) error {
|
||||
|
||||
func BenchmarkGoroutineWithFunc(b *testing.B) {
|
||||
var wg sync.WaitGroup
|
||||
|
||||
for i := 0; i < b.N; i++ {
|
||||
for j := 0; j < RunTimes; j++ {
|
||||
wg.Add(1)
|
||||
@ -96,7 +97,7 @@ func BenchmarkAntsPoolWithFunc(b *testing.B) {
|
||||
p.Serve(Param)
|
||||
}
|
||||
wg.Wait()
|
||||
b.Logf("running goroutines: %d", p.Running())
|
||||
//b.Logf("running goroutines: %d", p.Running())
|
||||
}
|
||||
}
|
||||
|
||||
@ -111,7 +112,6 @@ func BenchmarkGoroutine(b *testing.B) {
|
||||
func BenchmarkAntsPool(b *testing.B) {
|
||||
p, _ := ants.NewPoolWithFunc(AntsSize, demoPoolFunc)
|
||||
defer p.Release()
|
||||
|
||||
b.ResetTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
for j := 0; j < RunTimes; j++ {
|
||||
|
||||
14
pool.go
14
pool.go
@ -196,9 +196,17 @@ func (p *Pool) getWorker() *Worker {
|
||||
}
|
||||
|
||||
if waiting {
|
||||
p.cond.Wait()
|
||||
l := len(p.workers) - 1
|
||||
w = p.workers[l]
|
||||
for{
|
||||
p.cond.Wait()
|
||||
l := len(p.workers) - 1
|
||||
if l < 0{
|
||||
continue
|
||||
}
|
||||
w = p.workers[l]
|
||||
p.workers[l] = nil
|
||||
p.workers = p.workers[:l]
|
||||
break
|
||||
}
|
||||
} else if w == nil {
|
||||
w = &Worker{
|
||||
pool: p,
|
||||
|
||||
15
pool_func.go
15
pool_func.go
@ -198,9 +198,18 @@ func (p *PoolWithFunc) getWorker() *WorkerWithFunc {
|
||||
}
|
||||
|
||||
if waiting {
|
||||
p.cond.Wait()
|
||||
l := len(p.workers) - 1
|
||||
w = p.workers[l]
|
||||
for{
|
||||
p.cond.Wait()
|
||||
l := len(p.workers) - 1
|
||||
if l < 0{
|
||||
continue
|
||||
}
|
||||
w = p.workers[l]
|
||||
p.workers[l] = nil
|
||||
p.workers = p.workers[:l]
|
||||
break
|
||||
}
|
||||
|
||||
} else if w == nil {
|
||||
w = &WorkerWithFunc{
|
||||
pool: p,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user