-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmain.go
67 lines (58 loc) · 1.26 KB
/
main.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
61
62
63
64
65
66
67
package main
import (
"log"
"math"
"math/rand/v2"
"net/http"
"sync/atomic"
"time"
_ "net/http/pprof"
"github.com/thinkgos/timer"
)
// almost 1,000,000 task
func main() {
go func() {
sum := &atomic.Int64{}
t := time.NewTicker(time.Second)
for {
<-t.C
added := 0
ranv := rand.IntN(10)
max := int(rand.Uint32N(math.MaxUint16 << 2))
for i := 100; i < max; i += 200 {
added++
ii := i + ranv
timer.Go(func() {
sum.Add(1)
delayms := int64(ii) * 20
task := timer.NewTask(time.Duration(delayms) * time.Millisecond).WithJob(&job{
sum: sum,
expirationMs: time.Now().UnixMilli() + delayms,
})
timer.AddTask(task)
// for test race
// if ii%0x03 == 0x00 {
// timer.Go(func() {
// task.Cancel()
// })
// }
})
}
log.Printf("task: %v - %v added: %d", timer.TaskCounter(), sum.Load(), added)
}
}()
addr := ":9990"
log.Printf("http stated '%v'\n", addr)
log.Println(http.ListenAndServe(addr, nil))
}
type job struct {
sum *atomic.Int64
expirationMs int64
}
func (j *job) Run() {
j.sum.Add(-1)
now := time.Now().UnixMilli()
if diff := now - j.expirationMs; diff > 1 {
log.Printf("this task no equal, diff: %d %d %d\n", now, j.expirationMs, diff)
}
}