Вопрос проверяет опыт работы с воркерами.
Создайте общий context.WithCancel, передайте его воркерам, а при сигнале: Shutdown(ctx) для HTTP, закройте входящие каналы, дождитесь WaitGroup, освободите ресурсы (БД/кэш), соблюдая таймаут.
Шаблон последовательности:
ctx, cancel := context.WithCancel(root);
Запускаем HTTP и воркеры (получают ctx);
По сигналу:
server.Shutdown(timeoutCtx);
cancel() для фоновых задач;
wg.Wait() с разумным дедлайном;
закрыть коннекты к БД/кэшу.
var wg sync.WaitGroup
startWorker := func() {
wg.Add(1)
go func() {
defer wg.Done()
worker(ctx)
}()
}
<-stop
shutdownCtx, c := context.WithTimeout(context.Background(), 10*time.Second)
defer c()
_ = srv.Shutdown(shutdownCtx)
cancel()
wg.Wait()Уровень
Рейтинг:
5
Сложность:
7
Навыки
Golang
Networks
Ключевые слова
Подпишись на Golang Developer в телеграм