50 lines
1.1 KiB
Go
50 lines
1.1 KiB
Go
package strategy
|
|
|
|
import (
|
|
"log"
|
|
"sync"
|
|
|
|
"git.apinb.com/quant/gostock/internal/impl"
|
|
"git.apinb.com/quant/gostock/internal/models"
|
|
)
|
|
|
|
func Boot() {
|
|
InitCacheByAll()
|
|
}
|
|
|
|
func BootAiStart(key string, ymd int) {
|
|
var datas []models.StratModel
|
|
err := impl.DBService.Where("strat_key=? and ymd=? and ai_score=0", key, ymd).Find(&datas).Error
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// Create a buffered channel with a capacity of 20 to act as a semaphore
|
|
semaphore := make(chan struct{}, 20)
|
|
|
|
var wg sync.WaitGroup
|
|
for _, row := range datas {
|
|
wg.Add(1)
|
|
// Acquire a slot in the semaphore
|
|
semaphore <- struct{}{}
|
|
go func(row models.StratModel) {
|
|
defer wg.Done()
|
|
// Release the slot in the semaphore when done
|
|
defer func() { <-semaphore }()
|
|
BootAiTask(row.ID, row.Code, &wg)
|
|
}(row)
|
|
}
|
|
|
|
wg.Wait()
|
|
}
|
|
|
|
func BootAiTask(id uint, code string, wg *sync.WaitGroup) {
|
|
defer wg.Done()
|
|
result, err := AiAnalysis(code)
|
|
if err != nil {
|
|
log.Println("ERROR BootAiTask", err.Error())
|
|
return
|
|
}
|
|
impl.DBService.Model(&models.StratModel{}).Where("id=?", id).Updates(result)
|
|
}
|