cursor help me to improve insertPlate

This commit is contained in:
zhangkun9038@dingtalk.com 2025-01-15 00:17:11 +08:00
parent d234dea44a
commit 07d9a06471
3 changed files with 58 additions and 22 deletions

4
go.sum
View File

@ -49,8 +49,8 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
github.com/phyer/core v0.1.99 h1:clNHM5+7c23W1FyyHDYGXHHYZpGEbHOoRhOXpzhWwjQ=
github.com/phyer/core v0.1.99/go.mod h1:XZdniJiiZPzOU8+QHPFRQWdvJa6m5Ilj5VClWWI0OQg=
github.com/phyer/core v0.1.100 h1:xYOywQnKBqNqCD1NK/iFHi5EZX0CDsAfLgaE/BLmz8s=
github.com/phyer/core v0.1.100/go.mod h1:XZdniJiiZPzOU8+QHPFRQWdvJa6m5Ilj5VClWWI0OQg=
github.com/phyer/texus v0.0.0-20241207132635-0e7fb63f8196 h1:P1sxgCsS0VIL38ufZzgUuZLLyY/B+po6kSY7ziNZT7E=
github.com/phyer/texus v0.0.0-20241207132635-0e7fb63f8196/go.mod h1:iZexs5agdApNlp8HW/FqKgma4Ij1x8/o+ZLcMvY3f80=
github.com/phyer/v5sdkgo v0.1.4 h1:mAxxjPJVTYGuGDarqOcFGkzj5AgqbbzJGsnYmmsbapU=

View File

@ -2,18 +2,21 @@ package module
import (
"encoding/json"
"errors"
"fmt"
"github.com/phyer/core"
"os"
"strconv"
"strings"
"github.com/phyer/core"
// "sync"
"time"
//
// simple "github.com/bitly/go-simplejson"
// "github.com/go-redis/redis"
// "github.com/phyer/core/utils"
"sync"
logrus "github.com/sirupsen/logrus"
)
@ -21,6 +24,13 @@ type MyCandle struct {
core.Candle
}
// A. 使用对象池减少内存分配
var samplePool = sync.Pool{
New: func() interface{} {
return new(core.Candle)
},
}
func (cd *MyCandle) Process(cr *core.Core) {
tmi := ToInt64(cd.Data[0])
time.UnixMilli(tmi).Format("01-02 15:04")
@ -86,29 +96,55 @@ func (cd *MyCandle) Process(cr *core.Core) {
}
func (cd *MyCandle) InsertIntoPlate(cr *core.Core) (*core.Sample, error) {
cr.Mu.Lock()
defer cr.Mu.Unlock()
// pl, plateFounded := cr.PlateMap[cd.InstID]
// if !plateFounded || pl == nil {
pl, _ := LoadPlate(cr, cd.InstID)
cr.PlateMap[cd.InstID] = pl
// }
po, coasterFounded := pl.CoasterMap["period"+cd.Period]
err := errors.New("")
if !coasterFounded {
pl.MakeCoaster(cr, cd.Period)
// 1. 参数检查
if cr == nil || cd.InstID == "" || cd.Period == "" {
return nil, fmt.Errorf("invalid parameters: core=%v, instID=%s, period=%s",
cr != nil, cd.InstID, cd.Period)
}
if len(po.InstID) == 0 {
// logrus.Debug("candle coaster: ", cd.Period, pl.CoasterMap["period"+cd.Period], pl.CoasterMap)
//创建失败的原因是原始数据不够,一般发生在服务中断了,缺少部分数据的情况下, 后续需要数据补全措施
erstr := fmt.Sprintln("coaster创建失败 candle instID: "+cd.InstID+"; period: "+cd.Period, "coasterFounded: ", coasterFounded, " ", err)
err := errors.New(erstr)
return nil, err
// 2. 使用普通互斥锁 (因为sync.Mutex没有RLock方法)
cr.Mu.Lock()
pl, exists := cr.PlateMap[cd.InstID]
if !exists {
var err error
pl, err = LoadPlate(cr, cd.InstID)
if err != nil {
cr.Mu.Unlock()
return nil, fmt.Errorf("failed to load plate: %v", err)
}
cr.PlateMap[cd.InstID] = pl
}
cr.Mu.Unlock()
if pl == nil {
return nil, fmt.Errorf("plate is nil for InstID: %s", cd.InstID)
}
// 3. 处理Coaster
coasterKey := "period" + cd.Period
po, coasterFounded := pl.CoasterMap[coasterKey]
if !coasterFounded {
if err := pl.MakeCoaster(cr, cd.Period); err != nil {
return nil, fmt.Errorf("failed to make coaster: %v", err)
}
po, coasterFounded = pl.CoasterMap[coasterKey]
}
// 4. 验证coaster (修改判断方式)
if !coasterFounded || po.InstID == "" {
return nil, fmt.Errorf("invalid coaster for %s period %s", cd.InstID, cd.Period)
}
// 5. 推送样本
sm, err := po.RPushSample(cr, &cd.Candle, "candle")
return sm, err
if err != nil {
return nil, fmt.Errorf("failed to push sample: %v", err)
}
return sm, nil
}
func (cad *MyCandle) AddToGeneralCandleChnl(cr *core.Core) {
suffix := ""
env := os.Getenv("GO_ENV")

BIN
siaga

Binary file not shown.