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) }