From 02e7bcd810b278d922273809f438969406979e89 Mon Sep 17 00:00:00 2001 From: qydysky Date: Sat, 25 Nov 2023 17:16:50 +0800 Subject: [PATCH] 1 --- pool/Pool.go | 36 +++++++++++++++++++++++++++--------- pool/Pool_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 9 deletions(-) diff --git a/pool/Pool.go b/pool/Pool.go index 54e3d99..78d33c4 100644 --- a/pool/Pool.go +++ b/pool/Pool.go @@ -2,16 +2,20 @@ package part import ( "sync" + "time" ) type Buf[T any] struct { - maxsize int - newF func() *T - inUse func(*T) bool - reuseF func(*T) *T - poolF func(*T) *T - mbuf map[*T]bool - l sync.RWMutex + maxsize int + newF func() *T + inUse func(*T) bool + reuseF func(*T) *T + poolF func(*T) *T + mbuf map[*T]bool + getPerSec float64 + periodCount float64 + periodTime time.Time + l sync.RWMutex } // 创建池 @@ -33,15 +37,17 @@ func New[T any](NewF func() *T, InUse func(*T) bool, ReuseF func(*T) *T, PoolF f t.poolF = PoolF t.maxsize = maxsize t.mbuf = make(map[*T]bool) + t.periodTime = time.Now() return t } -// states[] 0:pooled, 1:nopooled, 2:inuse, 3:nouse, 4:sum +// states[] 0:pooled, 1:nopooled, 2:inuse, 3:nouse, 4:sum, 5:getPerSec func (t *Buf[T]) PoolState() (states []any) { t.l.RLock() defer t.l.RUnlock() var pooled, nopooled, inuse, nouse, sum int + var getPerSec float64 sum = len(t.mbuf) for k, v := range t.mbuf { @@ -57,13 +63,25 @@ func (t *Buf[T]) PoolState() (states []any) { } } - return []any{pooled, nopooled, inuse, nouse, sum} + getPerSec = t.periodCount / 10 + if diff := time.Since(t.periodTime).Seconds(); diff > 1 { + getPerSec += t.getPerSec / diff + } + + return []any{pooled, nopooled, inuse, nouse, sum, getPerSec} } func (t *Buf[T]) Get() *T { t.l.Lock() defer t.l.Unlock() + t.getPerSec += 1 + if diff := time.Since(t.periodTime).Seconds(); diff > 10 { + t.periodCount = t.getPerSec + t.getPerSec = 0 + t.periodTime = time.Now() + } + for k, v := range t.mbuf { if v && !t.inUse(k) { t.mbuf[k] = false diff --git a/pool/Pool_test.go b/pool/Pool_test.go index 30f1716..b9b718a 100644 --- a/pool/Pool_test.go +++ b/pool/Pool_test.go @@ -2,7 +2,9 @@ package part import ( "bytes" + "math" "testing" + "time" "unsafe" ) @@ -11,6 +13,36 @@ type a struct { v bool } +func Test1(t *testing.T) { + var newf = func() *a { + return &a{v: true} + } + + var validf = func(t *a) bool { + return t.v + } + + var reusef = func(t *a) *a { + t.d = t.d[:0] + t.v = true + return t + } + + var poolf = func(t *a) *a { + return t + } + + var b = New(newf, validf, reusef, poolf, 10) + + for i := 0; i < 10; i++ { + b.Get() + } + time.Sleep(time.Millisecond * 1100) + if math.Abs(b.PoolState()[5].(float64)-7.5) > 2.5 { + t.Fatal(b.PoolState()[5]) + } +} + func TestXxx(t *testing.T) { var newf = func() *a { return &a{v: true} -- 2.39.2