|
@@ -10,6 +10,7 @@ import ( |
|
@@ -10,6 +10,7 @@ import ( |
|
10
|
"opp/models"
|
10
|
"opp/models"
|
|
11
|
"opp/protocol"
|
11
|
"opp/protocol"
|
|
12
|
"reflect"
|
12
|
"reflect"
|
|
|
|
13
|
+ "sync"
|
|
13
|
"sync/atomic"
|
14
|
"sync/atomic"
|
|
14
|
"time"
|
15
|
"time"
|
|
15
|
)
|
16
|
)
|
|
@@ -63,22 +64,49 @@ func ComputeRankScore() (err error) { |
|
@@ -63,22 +64,49 @@ func ComputeRankScore() (err error) { |
|
63
|
defer func() {
|
64
|
defer func() {
|
|
64
|
atomic.CompareAndSwapInt32(&ComputeRankScoreFlag, 1, 0)
|
65
|
atomic.CompareAndSwapInt32(&ComputeRankScoreFlag, 1, 0)
|
|
65
|
}()
|
66
|
}()
|
|
66
|
- //TODO:启用多个协程执行
|
|
|
|
67
|
- if err = computeRankScore(); err != nil {
|
|
|
|
68
|
- log.Error(err)
|
67
|
+ //启用多个协程执行
|
|
|
|
68
|
+ var wg sync.WaitGroup
|
|
|
|
69
|
+ for i := 0; i < RankGoroutineNum; i++ {
|
|
|
|
70
|
+ index := i
|
|
|
|
71
|
+ work := func() {
|
|
|
|
72
|
+ if err = computeRankScore(index, wg); err != nil {
|
|
|
|
73
|
+ log.Error(err)
|
|
|
|
74
|
+ }
|
|
|
|
75
|
+ }
|
|
|
|
76
|
+ go work()
|
|
69
|
}
|
77
|
}
|
|
|
|
78
|
+ wg.Wait()
|
|
70
|
|
79
|
|
|
71
|
//更新状态
|
80
|
//更新状态
|
|
72
|
- //结束过期的到期的榜单
|
81
|
+ //结束进行中 已到期的榜单
|
|
|
|
82
|
+ updateRankPeriodStatus(protocol.RankPeriodBegin, protocol.RankPeriodEnd)
|
|
73
|
//开始等待的榜单
|
83
|
//开始等待的榜单
|
|
|
|
84
|
+ updateRankPeriodStatus(protocol.RankPeriodWaiting, protocol.RankPeriodBegin)
|
|
74
|
return
|
85
|
return
|
|
75
|
}
|
86
|
}
|
|
76
|
-func computeRankScore() (err error) {
|
87
|
+func updateRankPeriodStatus(fromStatus int, toStatus int) {
|
|
|
|
88
|
+ var (
|
|
|
|
89
|
+ sql = `update rank_period set status=?,update_at=NOW() where status=? and UNIX_TIMESTAMP(end_time)<? `
|
|
|
|
90
|
+ )
|
|
|
|
91
|
+ if toStatus == protocol.RankPeriodBegin {
|
|
|
|
92
|
+ sql = `update rank_period set status=?,update_at=NOW() where status=? and UNIX_TIMESTAMP(begin_time)>? `
|
|
|
|
93
|
+ }
|
|
|
|
94
|
+ orm := orm.NewOrm()
|
|
|
|
95
|
+ if err := utils.ExecuteSQLWithOrmer(orm, sql, toStatus, fromStatus, time.Now().Unix()); err != nil {
|
|
|
|
96
|
+ log.Error(err)
|
|
|
|
97
|
+ return
|
|
|
|
98
|
+ }
|
|
|
|
99
|
+}
|
|
|
|
100
|
+
|
|
|
|
101
|
+func computeRankScore(index int, wg sync.WaitGroup) (err error) {
|
|
77
|
var (
|
102
|
var (
|
|
78
|
periods []*models.RankPeriod
|
103
|
periods []*models.RankPeriod
|
|
79
|
rankRanges []*models.RankRange
|
104
|
rankRanges []*models.RankRange
|
|
80
|
rankRangeDatas []*models.RankRangeData
|
105
|
rankRangeDatas []*models.RankRangeData
|
|
81
|
)
|
106
|
)
|
|
|
|
107
|
+ wg.Add(1)
|
|
|
|
108
|
+ defer wg.Done()
|
|
|
|
109
|
+
|
|
82
|
defer func() {
|
110
|
defer func() {
|
|
83
|
if p := recover(); p != nil {
|
111
|
if p := recover(); p != nil {
|
|
84
|
log.Error(p)
|
112
|
log.Error(p)
|
|
@@ -91,6 +119,9 @@ func computeRankScore() (err error) { |
|
@@ -91,6 +119,9 @@ func computeRankScore() (err error) { |
|
91
|
//2.查询对应 rank_type_id 的rank_data
|
119
|
//2.查询对应 rank_type_id 的rank_data
|
|
92
|
for i := range periods {
|
120
|
for i := range periods {
|
|
93
|
period := periods[i]
|
121
|
period := periods[i]
|
|
|
|
122
|
+ if (period.Id % RankGoroutineNum) != index {
|
|
|
|
123
|
+ return
|
|
|
|
124
|
+ }
|
|
94
|
if rankRanges, err = models.GetRankRanges(period.CompanyId, period.RankTypeId); err == orm.ErrNoRows {
|
125
|
if rankRanges, err = models.GetRankRanges(period.CompanyId, period.RankTypeId); err == orm.ErrNoRows {
|
|
95
|
continue
|
126
|
continue
|
|
96
|
}
|
127
|
}
|
|
@@ -125,6 +156,7 @@ func computeRankScore() (err error) { |
|
@@ -125,6 +156,7 @@ func computeRankScore() (err error) { |
|
125
|
}
|
156
|
}
|
|
126
|
updateRankByRelationIds(relationIds, period, rankRange)
|
157
|
updateRankByRelationIds(relationIds, period, rankRange)
|
|
127
|
}
|
158
|
}
|
|
|
|
159
|
+ logProcessInfo(period)
|
|
128
|
}
|
160
|
}
|
|
129
|
|
161
|
|
|
130
|
//4.调用统计接口列表
|
162
|
//4.调用统计接口列表
|
|
@@ -134,6 +166,10 @@ func computeRankScore() (err error) { |
|
@@ -134,6 +166,10 @@ func computeRankScore() (err error) { |
|
134
|
return nil
|
166
|
return nil
|
|
135
|
}
|
167
|
}
|
|
136
|
|
168
|
|
|
|
|
169
|
+func logProcessInfo(period *models.RankPeriod) {
|
|
|
|
170
|
+ log.Debug(fmt.Sprintf("【排行榜统计】 周期编号:%v 赛季名称:%v (榜单类型:%v) ", period.Id, period.SeasonName, period.RankTypeId))
|
|
|
|
171
|
+}
|
|
|
|
172
|
+
|
|
137
|
//更新排行榜按关联id
|
173
|
//更新排行榜按关联id
|
|
138
|
func updateRankByRelationIds(relationIds []int64, period *models.RankPeriod, rankRange *models.RankRange) {
|
174
|
func updateRankByRelationIds(relationIds []int64, period *models.RankPeriod, rankRange *models.RankRange) {
|
|
139
|
var option RankOption
|
175
|
var option RankOption
|