61 lines
1.3 KiB
Go
61 lines
1.3 KiB
Go
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):
|
|
// Продолжаем работу
|
|
}
|
|
}
|
|
}
|
|
}
|