36 lines
717 B
Go
36 lines
717 B
Go
package service
|
|
|
|
import (
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
// analyzeOnce 应合并并发同键分析请求,只执行一次 fn
|
|
func TestAnalyzeOnceDedup(t *testing.T) {
|
|
var mu sync.Mutex
|
|
calls := 0
|
|
fn := func() (bool, string) {
|
|
mu.Lock()
|
|
calls++
|
|
mu.Unlock()
|
|
// 短暂阻塞确保所有并发调用在 singleflight 窗口内到达 Do,仅首次执行 fn
|
|
time.Sleep(50 * time.Millisecond)
|
|
return true, "dedup"
|
|
}
|
|
var wg sync.WaitGroup
|
|
for i := 0; i < 10; i++ {
|
|
wg.Add(1)
|
|
go func() {
|
|
defer wg.Done()
|
|
if retry, _ := analyzeOnce("k", fn); !retry {
|
|
t.Errorf("期望 retryable=true")
|
|
}
|
|
}()
|
|
}
|
|
wg.Wait()
|
|
if calls != 1 {
|
|
t.Fatalf("singleflight应只执行一次fn, got %d", calls)
|
|
}
|
|
}
|