Files
gostock/internal/logic/strategy/boot.go

67 lines
1.4 KiB
Go
Raw Normal View History

2026-01-27 00:25:34 +08:00
package strategy
2026-02-03 22:38:24 +08:00
import (
2026-02-04 00:37:05 +08:00
"fmt"
2026-02-03 22:38:24 +08:00
"log"
2026-02-03 22:42:47 +08:00
"sync"
2026-02-03 22:38:24 +08:00
"git.apinb.com/quant/gostock/internal/impl"
"git.apinb.com/quant/gostock/internal/models"
)
2026-01-27 00:25:34 +08:00
func Boot() {
2026-01-31 18:22:58 +08:00
InitCacheByAll()
2026-01-27 00:25:34 +08:00
}
2026-02-03 22:38:24 +08:00
2026-02-04 00:37:05 +08:00
// 启动 AI 分析任务
func BootAiStart(key string, ymd int) error {
2026-02-03 22:38:24 +08:00
var datas []models.StratModel
err := impl.DBService.Where("strat_key=? and ymd=? and ai_score=0", key, ymd).Find(&datas).Error
if err != nil {
2026-02-04 00:37:05 +08:00
log.Printf("Failed to query data: %v", err)
return fmt.Errorf("query failed: %w", err)
2026-02-03 22:38:24 +08:00
}
2026-02-03 22:42:47 +08:00
2026-02-04 00:37:05 +08:00
// 构造任务列表
var tasks []func()
2026-02-03 22:38:24 +08:00
for _, row := range datas {
2026-02-04 00:37:05 +08:00
row := row // 避免闭包捕获循环变量
tasks = append(tasks, func() {
BootAiTask(row.ID, row.Code)
})
2026-02-03 22:38:24 +08:00
}
2026-02-03 22:42:47 +08:00
2026-02-04 00:37:05 +08:00
// 使用并发控制执行任务
runWithLimit(20, tasks)
return nil
2026-02-03 22:38:24 +08:00
}
2026-02-04 00:37:05 +08:00
// 执行单个 AI 分析任务
func BootAiTask(id uint, code string) {
2026-02-03 22:38:24 +08:00
result, err := AiAnalysis(code)
if err != nil {
2026-02-04 00:37:05 +08:00
log.Printf("ERROR BootAiTask - ID: %d, Code: %s, Error: %v", id, code, err)
2026-02-03 22:38:24 +08:00
return
}
2026-02-04 00:37:05 +08:00
log.Printf("SUCCESS BootAiTask - ID: %d, Code: %s", id, code)
2026-02-03 22:38:24 +08:00
impl.DBService.Model(&models.StratModel{}).Where("id=?", id).Updates(result)
}
2026-02-04 00:37:05 +08:00
// 通用并发控制函数
func runWithLimit(limit int, tasks []func()) {
semaphore := make(chan struct{}, limit)
var wg sync.WaitGroup
for _, task := range tasks {
wg.Add(1)
semaphore <- struct{}{} // 获取信号量
go func(t func()) {
defer wg.Done()
defer func() { <-semaphore }() // 释放信号量
t()
}(task)
}
wg.Wait()
}