/
delay-chan.go
60 lines (51 loc) · 1.1 KB
/
delay-chan.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package utils
import (
"github.com/pkg/errors"
"github.com/yaklang/yaklang/common/log"
"math/rand"
"time"
)
/* delay with range */
type DelayWaiter struct {
max, min int32
nextDelay time.Duration
}
func abs(a, b int32) int32 {
if a > b {
return a - b
}
return b - a
}
func NewDelayWaiter(min int32, max int32) (*DelayWaiter, error) {
if min > 0 && max > 0 {
if max < min {
return nil, errors.Errorf("min delay[%d/s] should be less than max delay[%d/s]", min, max)
}
}
if min > 0 && max <= 0 {
return nil, errors.Errorf("min: %d max: %d failed", min, max)
}
d := &DelayWaiter{
min: min,
max: max,
}
return d, nil
}
func (d *DelayWaiter) Wait() {
time.Sleep(d.nextDelay)
if abs(d.max, d.min) > 0 {
d.nextDelay = time.Duration(int(rand.Int31n(abs(d.max, d.min))+d.min) * int(time.Second))
} else {
d.nextDelay = time.Duration(int(d.min) * int(time.Second))
}
}
func (d *DelayWaiter) WaitWithProbabilityPercent(raw float64) {
if raw < 0 || raw > 1 {
log.Errorf("failed to use delay probability percent: %v", raw)
} else {
if rand.Float64() > raw {
return
}
}
d.Wait()
}