116 lines
2.2 KiB
Go
116 lines
2.2 KiB
Go
package control_case
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"io/fs"
|
|
"log"
|
|
"os"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/gocarina/gocsv"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func exists(path string) (bool, error) {
|
|
_, err := os.Stat(path)
|
|
if err == nil {
|
|
return true, nil
|
|
}
|
|
if errors.Is(err, fs.ErrNotExist) {
|
|
return false, nil
|
|
}
|
|
return false, err
|
|
}
|
|
|
|
func worker(id int, jobs <-chan Params, ctx context.Context) {
|
|
for j := range jobs {
|
|
fmt.Printf("Worker %d started job %d \n", id, j.ID)
|
|
j.CreateFolder()
|
|
j.Run(ctx)
|
|
time.Sleep(time.Second) // Имитация длительной задачи
|
|
fmt.Printf("Worker %d finished job %d \n", id, j.ID)
|
|
// results <- j * 2
|
|
}
|
|
}
|
|
|
|
func readCSVWithGocsv() []Params {
|
|
file, err := os.Open("db.csv")
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
defer file.Close()
|
|
|
|
var params []Params
|
|
if err := gocsv.UnmarshalFile(file, ¶ms); err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
for _, person := range params {
|
|
fmt.Printf("%+v\n", person)
|
|
}
|
|
return params
|
|
}
|
|
|
|
func readFromDb(db *gorm.DB) []ControlCase {
|
|
var cases []ControlCase
|
|
statuses := []string{"N"}
|
|
_ = db.
|
|
Where("status IN ?", statuses).
|
|
Preload("Params").
|
|
Find(&cases).Error
|
|
return cases
|
|
}
|
|
|
|
func RunControllWorker(db *gorm.DB, results chan int) {
|
|
const numJobs = 1
|
|
const numWorkers = 10
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer func() {
|
|
fmt.Printf("cencel")
|
|
cancel()
|
|
}() // Cancel if main exits early
|
|
|
|
jobs := make(chan Params, numJobs)
|
|
//results := make(chan int, numJobs)
|
|
|
|
// Запуск воркеров
|
|
var wg sync.WaitGroup
|
|
for w := 1; w <= numWorkers; w++ {
|
|
wg.Add(1)
|
|
go func(w int) {
|
|
defer wg.Done()
|
|
worker(w, jobs, ctx)
|
|
}(w)
|
|
}
|
|
|
|
//params := readCSVWithGocsv()
|
|
for {
|
|
cases := readFromDb(db)
|
|
// Отправка задач
|
|
for _, c := range cases {
|
|
p := c.Params
|
|
e, _ := p.Exist()
|
|
if e {
|
|
c.Status = "R"
|
|
db.Save((&c))
|
|
} else {
|
|
p.CreateFolder()
|
|
jobs <- p
|
|
}
|
|
}
|
|
time.Sleep(10 * time.Second)
|
|
}
|
|
// Ожидание завершения всех воркеров
|
|
//fmt.Printf("wait")
|
|
// wg.Wait()
|
|
// close(jobs)
|
|
//
|
|
// // Получение результатов
|
|
// for r := range results {
|
|
// fmt.Println("Result:", r)
|
|
// }
|
|
}
|