package worker import ( "context" "log" "strconv" "time" "git.vakhrushev.me/av/transcriber/internal/metrics" "git.vakhrushev.me/av/transcriber/internal/service" ) // Worker представляет базовый интерфейс для всех воркеров type Worker interface { Start(ctx context.Context) Name() string } // ConversionWorker обрабатывает задачи конвертации type ConversionWorker struct { transcribeService *service.TranscribeService } func NewConversionWorker(transcribeService *service.TranscribeService) *ConversionWorker { return &ConversionWorker{ transcribeService: transcribeService, } } func (w *ConversionWorker) Name() string { return "ConversionWorker" } func (w *ConversionWorker) Start(ctx context.Context) { log.Printf("%s started", w.Name()) for { select { case <-ctx.Done(): log.Printf("%s received shutdown signal", w.Name()) return default: err := w.transcribeService.FindAndRunConversionJob() metrics.WorkerJobCounter.WithLabelValues(w.Name(), strconv.FormatBool(err != nil)).Inc() if err != nil { log.Printf("%s error: %v", w.Name(), err) } // Ждем 1 секунду перед следующей итерацией select { case <-ctx.Done(): log.Printf("%s received shutdown signal during sleep", w.Name()) return case <-time.After(1 * time.Second): // Продолжаем работу } } } } // TranscribeWorker обрабатывает задачи транскрипции type TranscribeWorker struct { transcribeService *service.TranscribeService } func NewTranscribeWorker(transcribeService *service.TranscribeService) *TranscribeWorker { return &TranscribeWorker{ transcribeService: transcribeService, } } func (w *TranscribeWorker) Name() string { return "TranscribeWorker" } func (w *TranscribeWorker) Start(ctx context.Context) { log.Printf("%s started", w.Name()) for { select { case <-ctx.Done(): log.Printf("%s received shutdown signal", w.Name()) return default: err := w.transcribeService.FindAndRunTranscribeJob() metrics.WorkerJobCounter.WithLabelValues(w.Name(), strconv.FormatBool(err != nil)).Inc() if err != nil { log.Printf("%s error: %v", w.Name(), err) } // Ждем 1 секунду перед следующей итерацией select { case <-ctx.Done(): log.Printf("%s received shutdown signal during sleep", w.Name()) return case <-time.After(1 * time.Second): // Продолжаем работу } } } } // CheckWorker обрабатывает задачи проверки статуса распознавания type CheckWorker struct { transcribeService *service.TranscribeService } func NewCheckWorker(transcribeService *service.TranscribeService) *CheckWorker { return &CheckWorker{ transcribeService: transcribeService, } } func (w *CheckWorker) Name() string { return "CheckWorker" } func (w *CheckWorker) Start(ctx context.Context) { log.Printf("%s started", w.Name()) for { select { case <-ctx.Done(): log.Printf("%s received shutdown signal", w.Name()) return default: err := w.transcribeService.FindAndRunTranscribeCheckJob() metrics.WorkerJobCounter.WithLabelValues(w.Name(), strconv.FormatBool(err != nil)).Inc() if err != nil { log.Printf("%s error: %v", w.Name(), err) } // Ждем 1 секунду перед следующей итерацией select { case <-ctx.Done(): log.Printf("%s received shutdown signal during sleep", w.Name()) return case <-time.After(1 * time.Second): // Продолжаем работу } } } }