package worker import ( "context" "log" "strconv" "time" "git.vakhrushev.me/av/transcriber/internal/contract" "git.vakhrushev.me/av/transcriber/internal/metrics" ) // Worker представляет базовый интерфейс для всех воркеров type Worker interface { Start(ctx context.Context) Name() string } type CallbackWorker struct { name string f func() error } func NewCallbackWorker(name string, f func() error) *CallbackWorker { return &CallbackWorker{name, f} } func (w *CallbackWorker) Name() string { return w.name } func (w *CallbackWorker) 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.f() _, isNoop := err.(*contract.NoopJobError) if !isNoop { metrics.WorkerJobCounter.WithLabelValues(w.Name(), strconv.FormatBool(err != nil)).Inc() } if err != nil && !isNoop { 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): // Продолжаем работу } } } }